Git - 在拉动时自动快进所有跟踪分支

时间:2011-01-02 09:40:37

标签: git branch pull

我已使用--track选项设置跟踪分支,当我在git pull上执行master时,它会将所有分支提取到origin/branchname但不会与本地跟踪分支合并。这是非常令人讨厌的,因为如果我稍后在git push上执行了master,则表示在跟踪分支上拒绝了非快进更新,因为它们在初始时没有快速转发git pull

我的问题是:如何设置git pull以获取所有分支并自动快进所有跟踪分支?

注意:git pull用于使用我的GitHub存储库快进所有跟踪分支,但现在我已经使用Gitolite设置了自己的存储库,这个问题就出现了。

6 个答案:

答案 0 :(得分:13)

Shell脚本,快速转发所有将其上游分支设置为匹配的origin / branch而不进行任何签出的分支

  • 它不会随时更改您当前的分支,无需处理工作副本更改和签出时间丢失

  • 它只执行快进,无法快进的分支将显示错误消息并将被跳过

确保所有分支机构'通过运行git branch -vv正确设置上游分支。使用git branch -u origin/yourbanchname

设置上游分支

复制粘贴到文件和chmod 755:

#!/bin/sh

curbranch=$(git rev-parse --abbrev-ref HEAD)

for branch in $(git for-each-ref refs/heads --format="%(refname:short)"); do
        upbranch=$(git config --get branch.$branch.merge | sed 's:refs/heads/::');
        if [ "$branch" = "$upbranch" ]; then
                if [ "$branch" = "$curbranch" ]; then
                        echo Fast forwarding current branch $curbranch
                        git merge --ff-only origin/$upbranch
                else
                        echo Fast forwarding $branch with origin/$upbranch
                        git fetch . origin/$upbranch:$branch
                fi
        fi
done;

答案 1 :(得分:5)

但等等:

注意:我认为您已跟踪所有远程分支,如“Track all remote git branches as local branches.


注意:Git 2.0(2014年第2季度)将引入commit b814da8配置push.ff:

pull.ff::
  

默认情况下,Git在合并作为当前提交后代的提交时不会创建额外的合并提交。相反,当前分支的提示是快进的。

     
      
  • 当设置为false时,此变量告诉Git在这种情况下创建额外的合并提交(相当于从命令行提供--no-ff选项)。
  •   
  • 设置为only时,只允许此类快进合并(相当于从命令行提供--ff-only选项。)
  •   

答案 2 :(得分:5)

如果您真的想快速转发所有跟踪远程分支的本地分支机构,您可以考虑将其作为别名添加到~/.gitconfig

[alias]
    pull-all = !"for b in $(git for-each-ref refs/heads --format='%(refname)') ; do git checkout ${b#refs/heads/} ; git pull --ff-only ; done"

然后您可以运行git pull-all,它将遍历您的本地分支并在每个分支上运行git pull --ff-only

答案 3 :(得分:2)

如果可能,以下单行快速前移所有具有上游分支的分支,否则显示错误:

git branch \
  --format "%(if)%(upstream:short)%(then)git push . %(upstream:short):%(refname:short)%(end)" |
  sh

它如何工作?

它通过git branch命令使用自定义格式。对于具有上游分支的每个分支,它将打印具有以下模式的行:

git push . <remote-ref>:<branch>

这可以直接通过管道传递到sh中(假设分支名称格式正确)。忽略| sh以查看其工作情况。

注意

当前已检出的分支不会用类似消息的更新

! [remote rejected] origin/master -> master (branch is currently checked out)

为此,您可以求助于常规git pull --ff-only

别名

将以下内容添加到您的.gitconfig中,以便git fft执行此命令:

[alias]
        fft = !sh -c 'git branch --format \"%(if)%(upstream:short)%(then)git push . %(upstream:short):%(refname:short)%(end)\" | sh' -

别名是“快进跟踪(分支)”的简写。

答案 4 :(得分:0)

例如,

SmartGit可以选择在切换到分支时自动合并已跟踪分支的更改。这应该做你想要实现的目标。

答案 5 :(得分:0)

我只是写了一个小工具来做到这一点。 https://github.com/changyuheng/git-fast-forward-all

此工具的优点:

  1. 在一个存储库中支持多个远程服务器。 (hub sync目前不支持多个遥控器。)
  2. 支持在本地分支和相应的远程跟踪分支上使用不同的名称。
  3. 比其他为每个分支远程获取脚本的脚本要快得多。
  4. 没有容易出错的正则表达式解析/编辑。
相关问题