在我的应用程序中,我使用 git 对一些外部文件进行版本管理
我正在使用命令git show HEAD~1:some_file
来获取文件的某个版本(基于 git 标签、提交哈希或与 HEAD 的关系)。当文件不存在时,会输出一条“致命”消息(我认为是 stderr 管道)。例如
致命:“HEAD~1”中不存在路径“some_file”
是否有一个干净的命令来检查某个文件是否存在于某个版本中?
在我的应用程序中,我使用 git 对一些外部文件进行版本管理
我正在使用命令git show HEAD~1:some_file
来获取文件的某个版本(基于 git 标签、提交哈希或与 HEAD 的关系)。当文件不存在时,会输出一条“致命”消息(我认为是 stderr 管道)。例如
致命:“HEAD~1”中不存在路径“some_file”
是否有一个干净的命令来检查某个文件是否存在于某个版本中?
你怎么用这个?在脚本中?您可以随时查看退出代码。并且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.
到目前为止我发现的最好的事情是:
git ls-tree -r HEAD~1 --name-only
它输出特定版本中的文件名列表。我需要解析输出并过滤特定文件。因此它没有我希望的那么直接,但小菜一碟。
由于您只需要命令的退出代码,因此您可以将 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