我正在编写一个自定义git命令,该命令只能在没有提交的全新存储库中运行(参见this question)。如何在我的脚本中执行简单检查以查看现有repo是否为零提交?
基本上,下面的空白是什么?
if ___________ ; then
echo "Git repo already has commits. Aborting.
else
echo "Git repo has no commits. Doing whatever my script does."
fi
答案 0 :(得分:28)
要点:
git rev-parse HEAD &> /dev/null
git rev-list -n 1 --all &> /dev/null
git fsck
,git count-objects
的repo:test输出中,或者检查.git/objects
的内容现在讨论了!
如果您想知道是否签出了提交,可以使用git rev-parse HEAD
。将有输出,因此您可能希望重定向到/dev/null
并只使用退出代码。出于所有实际目的,这将是足够好的 - 做正常的事情,如果没有HEAD
指向任何事情,几乎不可能结束。但是,例如通过删除.git目录中的文件是可能的。根据你的脚本,这可能很重要 - 如果你要吹掉.git目录,你确实想要偏执。
如果您想查看是否有任何引用,可以使用git rev-list -n 1 --all
。同样,将有输出(遇到第一个提交的SHA1),因此重定向到/dev/null
并检查退出代码。
最后,如果你想检查是否有任何提交 - 即使它们不在任何引用(你必须尝试真的很难进入这种状态)我可能只是检查git fsck
或git count-objects
对象是否存在 - 或者失败,列出.git/objects
并检查info
和pack
以外的任何内容(命令往往会失败)如果没有文件.git/HEAD
)。是的,你实际上可能有一个blob和树木的回购但没有提交,但你必须更努力地去那里。如果您的脚本很可怕,这些是绝对最安全的方法。
答案 1 :(得分:3)