git log——grep:在HEAD到最后一个(任意)分支名称的范围内搜索



我目前使用Git作为一个工具的一部分,我需要在其中标记一些Git存储库更改。因此,我创建了一些"市场承诺"。现在,我想知道如何有效地找到这些提交。

Git存储库都有一个特定的结构。我想用一个具体的例子来描述它:

考虑一个任意的(大的)存储库,它有一个分离的HEAD,总是有一个线性链到任意的下一个分支名称。该存储库上的git log --oneline看起来像:

9b6eea6063ae (HEAD) foo
51206b9c09db bar
8ec634b9e864 baz
...
2fba8a89a6ee marker123
75a8e54af67e (some_branch) ipsum
...

我现在要查找在到最后一个分支的路径上是否存在名称为marker123

的提交。使用git log --grep marker123 --format=oneline --max-count=1 | grep .,我发现了一个搜索该名称的命令,当提交存在时不返回错误,当它不存在时返回错误。但是,如果不存在commitmarker123,则搜索整个历史记录

。我可否将git log的搜寻范围限制在HEADsome_branch之间?我的主要问题是我没有提前知道some_branch的名字。我只知道它是在某个地方的线性链上的回提交,是一个分支名称。特别是,我不知道如何为git log定义一个提交范围。

旁注:我从git rebase -i中了解了一点这种行为,没有额外的目标提交规范。它还会从最后一个(远程?)分支开始进行重新base。

下面是一个脚本,用于设置两个存储库并演示问题:

#!/bin/sh
echo "Setup a repository, where the search works."
mkdir git-test; cd git-test
git init --initial-branch=random_name
git commit --allow-empty -m "marker123"
git tag "This-commit-never-ever-should-be-found"
git commit --allow-empty -m "ipsum"
git checkout --detach HEAD
git commit --allow-empty -m "marker123"
git commit --allow-empty -m "baz"
git commit --allow-empty -m "bar"
git commit --allow-empty -m "foo"
git log --oneline # situation of the example
echo -e "nSearch for marker:"
git log --grep "marker123" --oneline -1 | grep .
echo "Errorcode $?"
cd ..
echo "Setup a repository, where the search does not work."
mkdir git-test2; cd git-test2
git init --initial-branch=random_name
git commit --allow-empty -m "marker123"
git tag "This-commit-never-ever-should-be-found"
git commit --allow-empty -m "ipsum"
git checkout --detach HEAD
# git commit --allow-empty -m "marker123" # this commit is missing here
git commit --allow-empty -m "baz"
git commit --allow-empty -m "bar"
git commit --allow-empty -m "foo"
git log --oneline # situation of the example
echo -e "nSearch for marker:"
git log --grep "marker123" --oneline -1 | grep . # this should result in an error
echo "Errorcode $?"
git log --grep "marker123" --oneline -1 "random_name..HEAD" | grep . # this works here but only if random_name is known
echo "Errorcode $?"
cd ..

您可以:

  • 列出不包含HEAD的分支:
git branch --no-contains HEAD
  • git log HEAD --not [list of branches ...]命令中使用:
git log --oneline HEAD --not $(git branch --no-contains HEAD)

如果上面的命令给了你期望的历史记录,你可以添加任何你认为合适的选项到git log:

git log --grep marker123 -1 --oneline HEAD --not $(git branch --no-contains HEAD)

相关内容

  • 没有找到相关文章

最新更新