Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 检查本地git回购是否在远程回购之前/之后_Linux_Git_Bash_Shell_Github - Fatal编程技术网

Linux 检查本地git回购是否在远程回购之前/之后

Linux 检查本地git回购是否在远程回购之前/之后,linux,git,bash,shell,github,Linux,Git,Bash,Shell,Github,我正在开发一个git插件,我需要知道何时使用命令行更改本地repo(可以提交更改)、提前(可以推到远程)或延迟(可以从远程拉) 这就是我目前正在做的: 你能承诺吗 如果git diff index--name only--ignore submodules HEAD--返回一些内容, 然后是的,有更改要提交 你能推吗 如果git status-sb在其输出中包含前面的单词,那么是的,在那里 是要推的 你会拉吗 还没有实施任何措施 谁能承诺?这部分似乎工作正常。你能推吗?只适用于主分支,这是一

我正在开发一个git插件,我需要知道何时使用命令行更改本地repo(可以提交更改)、提前(可以推到远程)或延迟(可以从远程拉)

这就是我目前正在做的:

  • 你能承诺吗

    如果
    git diff index--name only--ignore submodules HEAD--
    返回一些内容, 然后是的,有更改要提交

  • 你能推吗

    如果
    git status-sb
    在其输出中包含前面的单词,那么是的,在那里 是要推的

  • 你会拉吗

    还没有实施任何措施

谁能承诺?这部分似乎工作正常。你能推吗?只适用于主分支,这是一个巨大的问题


我如何安全地检查git回购在每个分支上是否都有要提交的更改、要推送的更改或需要
git拉取?

您可以通过
的组合来实现这一点。如果
git merge base
返回与
git rev parse
相同的结果,那么您的本地分支就在前面。如果它返回与git rev parse相同的值,那么您的本地分支就落后了。如果
merge base
返回的答案与
rev parse
中的任何一个不同,则分支已分叉,您需要进行合并


不过,最好在检查分支之前执行
git fetch
,否则您是否需要提取的决定将过时。您还需要验证所检查的每个分支是否都有一个远程跟踪分支。您可以使用
--format='%(上游:short)“refs/heads/
来完成此操作。该命令将返回
的远程跟踪分支,如果没有,则返回空字符串。因此,如果分支没有远程跟踪分支,则会有一个不同的版本返回错误,这可能对您的目的更有用。

最后,我在我的C++11中实现了这一点

到目前为止似乎有效
canPull
仍需要测试和实现

说明:

  • currentBranch
    获取控制台输出,它是当前分支名称的字符串
  • canCommit
    获取控制台是否输出某些内容(当前更改和HEAD之间的差异,忽略子模块)
  • canPush
    获取origin/
    currentBranch
    和本地回购之间的更改计数-如果
    >0
    ,则可以推送本地回购

    • 多亏了@Trebor,我才拼凑了一个简单的fish函数:

      #! /usr/bin/fish
      #
      # Echos (to stdout) whether your branch is up-to-date, behind, ahead or diverged from another branch.
      # Don't forget to fetch before calling.
      #
      # @param branch
      # @param otherbranch
      #
      # @echo string up-to-date/behind/ahead/diverged
      #
      # @example
      #
      #   # if master is ahead of origin/master you can find out like this:
      #   #
      #   if test ( branch-status master origin/master ) = ahead
      #
      #      echo "We should push"
      #
      #   end
      #
      function branch-status
      
          set -l a $argv[ 1 ]
          set -l b $argv[ 2 ]
      
          set -l base ( git merge-base $a $b )
          set -l aref ( git rev-parse  $a    )
          set -l bref ( git rev-parse  $b    )
      
               if [ $aref = $bref ]; echo up-to-date
      
          else if [ $aref = $base ]; echo behind
          else if [ $bref = $base ]; echo ahead
      
          else                     ; echo diverged
          end
      
      end
      

      供日后参考。自Git v2.17.0起

      git status -sb
      
      包含后面的单词。 这样就可以直接用来检查拉力


      注意:在运行
      git status-sb
      之前,请记住运行
      git fetch
      ,我制作了一个bash版本的@user1115652 answer

      function branch_status() {
        local a="master" b="origin/master"
        local base=$( git merge-base $a $b )
        local aref=$( git rev-parse  $a )
        local bref=$( git rev-parse  $b )
      
        if [[ $aref == "$bref" ]]; then
          echo up-to-date
        elif [[ $aref == "$base" ]]; then
          echo behind
        elif [[ $bref == "$base" ]]; then
          echo ahead
        else
          echo diverged
        fi
      }
      

      对于推送部分,您将使用Git 2.5+(2015年第2季度)
      Git为每个ref--format=“%(推送:跟踪)”ref/heads
      。更多信息,谢谢你。到目前为止,关于堆栈溢出的几篇文章给出了最清晰的答案。我将其转换为bash脚本。可以使用
      git rev list origin为我推送作品..HEAD
      function branch_status() {
        local a="master" b="origin/master"
        local base=$( git merge-base $a $b )
        local aref=$( git rev-parse  $a )
        local bref=$( git rev-parse  $b )
      
        if [[ $aref == "$bref" ]]; then
          echo up-to-date
        elif [[ $aref == "$base" ]]; then
          echo behind
        elif [[ $bref == "$base" ]]; then
          echo ahead
        else
          echo diverged
        fi
      }