如何检查git存储库中是否有任何提交?

Rya*_*son 18 git

我正在编写一个自定义git命令,该命令只能在没有提交的全新存储库中运行(请参阅此问题).如何在我的脚本中执行简单检查以查看现有repo是否为零提交?

基本上,下面的空白是什么?

if ___________ ; then
    echo "Git repo already has commits. Aborting.
else
    echo "Git repo has no commits. Doing whatever my script does."
fi
Run Code Online (Sandbox Code Playgroud)

Cas*_*bel 28

摘要:

  • 签出提交:test git rev-parse HEAD &> /dev/null
  • 指向提交的ref存在:test git rev-list -n 1 --all &> /dev/null
  • 对象在回购存在:的测试输出git fsck,git count-objects或检查的内容.git/objects

现在讨论!

如果您想知道是否签出了提交,您可以使用git rev-parse HEAD.会有输出,所以你可能想要重定向到/dev/null并只使用退出代码.出于所有实际目的,这将是足够好的 - 做正常的事情,几乎不可能在没有HEAD指向任何东西的情况下结束.但是,例如通过删除.git目录中的文件是可能的.根据你的脚本,这可能很重要 - 如果你要吹掉.git目录,你确实想要偏执.

如果你想查看是否有任何引用,你可以使用git rev-list -n 1 --all.同样,将有输出(遇到第一次提交的SHA1),因此重定向到/dev/null并检查退出代码.

最后,如果你想检查是否有任何提交-即使他们没有任何裁判(你必须尝试真的很难进入这种状态),我可能只是检查物体的存在与git fsckgit count-objects-或做不到这一点,清单.git/objects和检查什么,除了infopack(命令倾向,如果没有文件失败.git/HEAD).是的,你实际上可能有一个blob和树木的回购但没有提交,但你必须更努力地去那里.如果您的脚本很可怕,这些是绝对最安全的方法.

  • 好吧,那就是它. (4认同)
  • git rev-list -n1 --all总是以退出代码0退出,无论是否有引用。使用`test -n“ $(git rev-list -n1 --all)”对我来说很好。 (2认同)