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

xesrikrc  于 2022-11-20  发布在  Git
关注(0)|答案(6)|浏览(201)

我已经用--track选项设置了跟踪分支,当我在master上执行git pull时,它会获取origin/branchname的所有分支,但不会与本地跟踪分支合并。这非常烦人,因为如果我以后在master上执行git push,它会说非快进更新在跟踪分支上被拒绝。因为它们在初始的git pull上没有被快进。
我的问题是:如何使git pull获取所有分支并自动快进所有跟踪分支?

  • 注意:git pull曾经用我的GitHub仓库快进我所有的跟踪分支,但是现在我用Gitolite建立了我自己的仓库,这个问题突然出现了。*
pkbketx9

pkbketx91#

Shell脚本,用于将其上游分支设置为匹配的源/分支的所有分支快进,而不执行任何 checkout

  • 它在任何时候都不会更改您当前的分支,无需处理工作副本的更改和 checkout 所损失的时间
  • 它只执行快进,不能快进的分支将显示错误消息并被跳过

通过运行git branch -vv确保所有分支的上游分支都设置正确。
复制粘贴到文件中并执行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;
332nm8kg

332nm8kg2#

如果你真的想快进所有正在跟踪远程分支的本地分支,你可能需要考虑把这个作为别名添加到你的~/.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

gg58donl

gg58donl3#

但是等待:

  • Git不会合并(git pull的第二步,在fetch部分之后)文件,除非先 checkout 分支。参见“Can “ git pull --all ” update all my local branches?
  • master上的git pull将合并master上的文件,这意味着下一次推送将是快进推送。只有在 * 您的 * 推送之前已经从另一个存储库 * 推送到远程master * 时,才会发生非快进。

注意:我想您已经跟踪了所有的远程分支,如“Track all remote git branches as local branches.“中所示
注意:Git 2.0(2014年第二季度)将在commit b814da8中引入一个配置pull.ff

pull.ff::

默认情况下,Git在合并当前提交的后代提交时不会创建额外的合并提交,而是快进当前分支的尖端。

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

mzsu5hc04#

下面的单行代码在可能的情况下快进所有具有上游分支的分支,否则输出错误:

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

它是如何工作的?

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

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

这可以直接通过管道传输到sh(假设分支名称是格式良好的)。省略| sh,看看它在做什么。
警告
当前 checkout 的分支将不会更新,并显示如下消息

! [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' -

别名是“快进跟踪(分支)"的缩写。

wqnecbli

wqnecbli5#

我只是编写了一个小工具来实现这一点。https://github.com/changyuheng/git-fast-forward-all
此工具的优点:
1.在一个仓库中支持多个远程。(hub sync目前不支持多个远程。)
1.支持本地分支和对应的远程跟踪分支有不同的名称。
1.比其他为每个分支提取远程的脚本快得多。
1.没有容易出错的正则表达式解析/编辑。

62lalag4

62lalag46#

例如,SmartGit有一个选项,如果你切换到一个分支,它会自动合并来自跟踪分支的更改。

相关问题