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

时间:2011-03-30 20:18:38

标签: git

我正在编写一个自定义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

2 个答案:

答案 0 :(得分:28)

要点:

  • 签出提交:test git rev-parse HEAD &> /dev/null
  • 指向提交的ref存在:test git rev-list -n 1 --all &> /dev/null
  • 对象存在于git fsckgit 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 fsckgit count-objects对象是否存在 - 或者失败,列出.git/objects并检查infopack以外的任何内容(命令往往会失败)如果没有文件.git/HEAD)。是的,你实际上可能有一个blob和树木的回购但没有提交,但你必须更努力地去那里。如果您的脚本很可怕,这些是绝对最安全的方法。

答案 1 :(得分:3)

您想使用git log

如果您正在使用cygwin或在Linux机器上gitk也是一个有用的程序。