Git:检查某个版本中文件是否存在

15
在我的应用程序中,我使用git来管理某些外部文件的版本。我使用像git show HEAD~1:some_file这样的命令来获取文件的特定版本(基于git标签、提交哈希或与HEAD的关系)。当文件不存在时,会输出一个"致命"消息(我认为是输出到stderr管道)。例如:

fatal: Path 'some_file' does not exist in 'HEAD~1'

有没有一种干净的命令可以检查一个文件在某个版本中是否存在?
3个回答

22

你是如何使用这个的?在脚本中吗?你总是可以检查退出代码。而 git cat-file 可能更适合:

git cat-file -e HEAD~1:some_file

使用-e选项,当对象不存在时将以非零错误代码退出,当存在时则以零退出。然而,它仍会打印出fatal: Not a valid object name,但这很容易被抑制:

    git cat-file -e HEAD~1:some_file 2> /dev/null && echo Not found. || echo Found.

谢谢,我确实是从(ruby)脚本中调用此函数。据我所知,cat-filegit show没有任何区别。 -e抑制了标准输出,但不是标准错误。因此,仍然会收到致命错误。我希望有一个命令可以询问Git:“这个文件是否存在?”而不是将其抑制。 - Len
顺序不好,应该是: git cat-file -e HEAD~1:some_file 2> /dev/null && echo Found. || echo Not Found - Johann

8
到目前为止我发现最好的东西是:
git ls-tree -r HEAD~1 --name-only

这个命令可以输出特定版本的文件名列表。我需要解析输出并过滤出一个特定的文件。因此它没有我希望的那么直接,但很简单。


3
你可以通过在ls-tree命令中包含文件路径(同时跳过-r)来避免解析:git ls-tree HEAD~1 --name-only path/to/file。但是,ls-tree不支持cat-file的-e选项以提供yes/no退出状态,因此需要另一步骤才能在脚本中使用条件语句。(-z或-n,管道到“grep。”以获取状态等) - Joshua Goldberg

7

既然你只需要命令的退出码,你可以将stdout和stderr重定向到/dev/null:

git show HEAD~1:some_file > /dev/null 2>&1

退出代码为0表示文件存在。

您应该能够在Ruby系统调用中使用整行:

exit_code = system("git show HEAD~1:some_file > /dev/null 2>&1")

如果你是在Bash中进行操作,可以通过以下方式获取退出码:

git show HEAD~1:some_file > /dev/null 2>&1
if [ $? -ne 0 ]; then
  # the file does not exist
fi

这正是我在寻找的,非常感谢。被采纳的答案产生了太多输出,我确信有一种方法可以将其限制为仅一个文件,并进行相应的返回代码分析。 - RAM237

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接