Har*_*thy 5 git blame git-blame
该命令git blame --ignore-revs-file .git-blame-ignore-revs add.txt适用于我机器上本地的非裸存储库,但是当我在本地获取同一存储库的裸存储库并尝试相同的命令时,会发生以下情况:
git blame --ignore-revs-file .git-blame-ignore-revs add.txt
fatal: could not open object name list: .git-blame-ignore-revs
Run Code Online (Sandbox Code Playgroud)
还请注意,当我们在位于文件系统其他位置的复制文件中传递相同内容时,它会起作用。例如:git blame --ignore-revs-file /tmp/.git-blame-ignore-revs add.txt工作正常。
我认为这可能是因为它无法找到裸存储库中提到的路径,所以我尝试了类似以下的操作:
git blame --ignore-revs-file -- .git-blame-ignore-revs add.txt
但这导致:
fatal: bad revision '.git-blame-ignore-revs'
谁能帮助我了解如何在针对裸存储库运行 git 命令时将文件路径传递给选项?还是根本不可能?
Run Code Online (Sandbox Code Playgroud)git blame --ignore-revs-file -- .git-blame-ignore-revs add.txt但这导致:
fatal: bad revision '.git-blame-ignore-revs'我问这个问题是为了了解是否可以使用存储库中签入的文件。
是的,但是语法git blame --ignore-revs-file是:
git blame --ignore-revs-file <file> -- <file>
Run Code Online (Sandbox Code Playgroud)
意义:
<file>(在双连字符之前)是你的.git-blame-ignore-revs<file>(在双连字符之后)是您的文件。通过放在.git-blame-ignore-revs 后面 --,您强制git命令将其视为“非选项参数”。
然而,在裸存储库中,没有工作树,因此--ignore-revs-file没有可供引用的实际文件。
编辑:啊。我得到它。您想要使用该文件的提交版本。裸克隆中的存储库内容通常不会作为单独的文件存在,历史记录会以包的形式发送。你必须要求 git 自己显示该提交文件的内容:
git blame --ignore-revs-file <(git show @:.git-blame-ignore-revs) add.txt
Run Code Online (Sandbox Code Playgroud)
或者为了纯度点、榴弹炮的未来保障和几微秒的速度,
git blame --ignore-revs-file <(git cat-file blob @:.git-blame-ignore-revs) add.txt
Run Code Online (Sandbox Code Playgroud)
当我这样做时,它有效:
sh -x <<\EOD; rm -rf deleteme
git init --bare deleteme; cd $_
git update-index --add --cacheinfo 100000,$(git hash-object -w config),add.txt
git --work-tree . commit -m-
git log --oneline --name-status
> .git-blame-ignore-revs
git blame --ignore-revs-file .git-blame-ignore-revs add.txt
EOD
Run Code Online (Sandbox Code Playgroud)
当我这样做时
sh -x <<\EOD; rm -rf deleteme
git init --bare deleteme; cd $_
git update-ref HEAD $(git commit-tree -m - $(git mktree <&-))
> .git-blame-ignore-revs
git blame --ignore-revs-file .git-blame-ignore-revs add.txt
EOD
Run Code Online (Sandbox Code Playgroud)
错误消息是fatal: no such path add.txt in HEAD.
所以我认为你的第一个测试确实没有存在该忽略列表。