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

Che*_*tan 32 git branch pull

我已经使用该--track选项设置了跟踪分支,当我执行操作git pullmaster,它会获取所有分支origin/branchname但不与本地跟踪分支合并.这是额外的烦人,因为如果我以后做一个git pushmaster,它说,非快速向前更新被拒绝在跟踪分支,因为他们并没有在最初的快速转发git pull.

我的问题是:如何git pull通过获取所有分支并自动快进所有跟踪分支来实现它?

注意:git pull用于使用我的GitHub存储库快速转发所有跟踪分支,但现在我已经使用Gitolite建立了自己的存储库,这个问题正在出现.

qwe*_*guy 15

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;
Run Code Online (Sandbox Code Playgroud)

  • 这种情况经常发生在我身上……但通常我不在 master 上工作,而 master 分支是唯一需要快速转发的分支。从这个答案中的脚本修改的一行对我来说非常有用:`git fetch 。起源/主人:主人`。这是`git fetch <repository> <remote-branch>:<local-branch>`。 (2认同)

krl*_*mlr 6

如果可能的话,下面的一行代码快进所有具有上游分支的分支,否则打印错误:

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

它是如何工作的?

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

git push . <remote-ref>:<branch>
Run Code Online (Sandbox Code Playgroud)

这可以直接通过管道输入sh(假设分支名称格式正确)。省略| sh以查看它在做什么。

警告

当前签出的分支将不会更新为类似的消息

! [remote rejected] origin/master -> master (branch is currently checked out)
Run Code Online (Sandbox Code Playgroud)

为此,您可以诉诸常规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' -
Run Code Online (Sandbox Code Playgroud)

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


Von*_*onC 5

可是等等:

注:我想你已经跟踪你的所有远程分支机构" 跟踪所有远程的Git分支为当地的分支机构. "


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

pull.ff::
Run Code Online (Sandbox Code Playgroud)

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

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


Jör*_*ees 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"
Run Code Online (Sandbox Code Playgroud)

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

  • "checkout"可能是不合需要的,因为它需要更新工作树,这可能会触发IDE或其他任何观看文件的更新.为避免这种情况,您可以使用`update-ref`,如下所示:http://stackoverflow.com/questions/5147537/how-do-i-fast-forward-other-tracking-branches-in-git# 5148202 (2认同)