11

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

我正在使用命令git show HEAD~1:some_file来获取文件的某个版本(基于 git 标签、提交哈希或与 HEAD 的关系)。当文件不存在时,会输出一条“致命”消息(我认为是 stderr 管道)。例如

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

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

4

3 回答 3

19

你怎么用这个?在脚本中?您可以随时查看退出代码。并且git cat-file可能更适合:

git cat-file -e HEAD~1:some_file

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

    git cat-file -e HEAD~1:some_file 2> /dev/null && echo Not found. || echo Found.
于 2013-08-27T09:51:55.870 回答
8

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

git ls-tree -r HEAD~1 --name-only

它输出特定版本中的文件名列表。我需要解析输出并过滤特定文件。因此它没有我希望的那么直接,但小菜一碟。

于 2013-08-28T06:44:07.427 回答
6

由于您只需要命令的退出代码,因此您可以将 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
于 2015-05-01T01:31:58.987 回答