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

Sir*_*lot 8 git version-control

在我的应用程序中,我使用git进行某些外部文件的版本管理

我正在使用命令git show HEAD~1:some_file来获取文件的某个版本(基于git标记,提交哈希或与HEAD的关系).当文件不存在时,输出"致命"消息(我想到stderr管道).例如

致命:'HEAD~1'中不存在路径'some_file'

是否有一个干净的命令来检查某个版本中是否存在某个文件?

man*_*lds 14

你好吗?在脚本中?您始终可以检查退出代码.并且git cat-file可能更适合:

git cat-file -e HEAD~1:some_file
Run Code Online (Sandbox Code Playgroud)

使用该-e选项,当对象不存在时,它将以非零错误代码退出,而当对象不存在时,它将以0返回.但是,它也会打印出来fatal: Not a valid object name,但这很容易被抑制.


Sir*_*lot 6

到目前为止,我发现的最好的事情是:

git ls-tree -r HEAD~1 --name-only
Run Code Online (Sandbox Code Playgroud)

输出特定版本的文件名列表。我需要解析输出并过滤特定文件。因此,它比我希望的要少一些直接的工作,只是小菜一碟。

  • 您可以通过在 ls-tree 命令中包含文件路径(也跳过 -r)来避免解析:`git ls-tree HEAD~1 --name-only path/to/file`。不过,ls-tree 不支持 cat-file 的 -e 选项来给出是/否退出状态,因此需要另一个步骤才能在脚本中的条件中使用。(-z 或 -n,通过管道连接到“grep .”以获取状态等) (4认同)

小智 6

由于您只需要命令的退出代码,您可以将 stdout 和 stderr 重定向到 /dev/null:

git show HEAD~1:some_file > /dev/null 2>&1
Run Code Online (Sandbox Code Playgroud)

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

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

exit_code = system("git show HEAD~1:some_file > /dev/null 2>&1")
Run Code Online (Sandbox Code Playgroud)

为了在 Bash 中执行此操作的任何人的利益,您可以通过以下方式获取退出代码:

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