【问题标题】:Check that the local git repo has everything committed and pushed to master检查本地 git repo 是否已提交所有内容并推送到 master
【发布时间】:2017-02-16 02:13:30
【问题描述】:

我有一些 shell 脚本,我想在其中检查我的一个 git 存储库。我想要 知道该 repos 是否已提交所有内容以及是否已将其推送到 master。 在此测试之前,我进行 git fetch 以确保我有最新的更改。

我找到了检查 repo 是否有一些未提交的更改的方法:

if ! git --work-tree=$HOME/git/project --git-dir=$HOME/git/project/.git diff-index --quiet HEAD --; then
    echo "Has some changes";
fi

但这不是我唯一需要的。我也想确保我所有的 本地提交被推送到 master。

最简单的方法是什么?

【问题讨论】:

    标签: git


    【解决方案1】:

    一个非常简单的方法是简单地调用

    git push -n

    (“-n”是“--dry-run”的缩写,这意味着它不会进行推送,而是会告诉你它会推送什么)

    如果它显示“所有内容都是最新的”,那么您已经将所有内容推送到原始位置。

    另外,它会为您提供所有尚未推送到源的提交的列表。

    或者,如果您尚未拉下原点的更改,那么它可能会抱怨可能由推送引起的合并(这与您已经在做的“有一些更改”检查重复)

    【讨论】:

    • 如果您在本地分支上,则为Everything up-to-date。即使此分支上没有推送任何内容。
    【解决方案2】:

    您可以检查所有内容是否已提交:

    git diff --exit-code && git diff --cached --exit-code
    

    在典型配置中,成功推送到origin 中的master 后,远程跟踪分支origin/master 将被更新。因此,要检查您是否已推送所有更改,您可以测试:

    git rev-parse --verify master
    

    ... 等同于:

    git rev-parse --verify origin/master
    

    【讨论】:

    • 如果你想要和--exit-code一样的功能没有输出,试试:git diff --quiet && git diff --cached --quiet
    • 不正确。如果 repo 中有未提交的 new 文件,这不会出错。
    【解决方案3】:

    git fetch 之后,要检查您的分支中是否有尚未推送到远程的本地提交,请尝试以下操作:

    git diff --exit-code <remote>/<branch>..<branch>
    

    这还将告诉您远程中是否有您在本地没有的提交。请注意,这只是检查更改,因此如果在远程和本地分支中存在具有相同更改的不同提交,则此命令可能不会检测到这一点。在脚本中,我通常将其通过管道传送到 /dev/null 并检查返回状态。所以,假设你的遥控器是origin,而你的分支是master,那么命令应该是这样的:

    git diff --exit-code origin/master..master > /dev/null
    

    正如其他人所建议的,我也使用git diff --exit-codegit diff --cached --exit-code 来检查本地未提交的更改。

    【讨论】:

      【解决方案4】:

      从 Mark Longair 的出色回答中,我了解到可以检查 本地 git repo 已提交并推送所有内容,但您需要运行 执行此操作的几个命令。

      我写了一个小脚本,它可以完成所有这些,并以友好的方式写下什么 已经发生了。

      $ is_git_synced ~/git/* --only_errors
      Error: path '/home/bessarabov/git/Dancer' has staged changes
      Error: path '/home/bessarabov/git/Ubic' has some divergences with remote 'origin'
      

      您还可以使用退出代码来确定是否所有内容都已提交并且 推还是不推。

      它位于 Github:https://github.com/bessarabov/App-IsGitSynced 和 CPAN:https://metacpan.org/module/App::IsGitSynced

      【讨论】:

      • Mark Longair 和您的解决方案似乎遗漏了未跟踪的文件。因此,根据您的目的,该目录可能仍被视为脏目录。
      • @vlad-didenko 也许我不理解你,但我的解决方案显示了未跟踪的文件。屏幕截图:upload.bessarabov.ru/bessarabov/LbYgP0Daba-oJ5vCDa8Wag8a5H8.png 生成它的代码:metacpan.org/source/BESSARABV/App-IsGitSynced-1.0.0/bin/…
      • 是的,我相信是我不够清楚。 “git diff --exit-code && git diff --cached --exit-code”命令不会捕获未跟踪的文件。您的解决方案是一个大型(相对)脚本,它几乎不能回答上述“最简单的方法”问题 - 这个问题显然需要一些简单的命令。作为从搜索中来到这里的人,我没有看到答案——因为通过相当多的 perl 脚本并不是一个(好的)答案。也许它在那里,但不在这里:)
      • 啊哈,现在我明白了。你说的对。 git diff --exit-code &amp;&amp; git diff --cached --exit-code 不显示有关未跟踪文件的信息。起初我以为你是说这 2 个命令和我的脚本 is_git_synced 都没有提供有关未跟踪文件的信息(它只对 2 个命令是正确的,对于我的脚本是不正确的)。
      • 是的,我同意脚本is_git_synced 的缺点是必须安装,而不是“开箱即用”,但它的优点是它可以正常工作(以及其他事情是不工作)=)
      猜你喜欢
      • 2011-07-16
      • 1970-01-01
      • 1970-01-01
      • 2018-04-25
      • 2017-12-22
      • 2013-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多