Git-拉动时自动快进所有跟踪分支
我已经使用Git-拉动时自动快进所有跟踪分支,git,branch,pull,Git,Branch,Pull,我已经使用--track选项设置了跟踪分支,当我在master上执行git pull时,它会将所有分支提取到origin/branchname,但不会与本地跟踪分支合并。这是非常烦人的,因为如果我以后在master上执行git push,它会说跟踪分支上的非快进更新被拒绝,因为它们在最初的git pull上不是快进的 我的问题是:如何使git使用fetch all branch拉取,并自动快进所有跟踪分支? 注意:git pull用于使用我的GitHub repos快进我的所有跟踪分支,但现在我
--track
选项设置了跟踪分支,当我在master
上执行git pull
时,它会将所有分支提取到origin/branchname
,但不会与本地跟踪分支合并。这是非常烦人的,因为如果我以后在master
上执行git push
,它会说跟踪分支上的非快进更新被拒绝,因为它们在最初的git pull
上不是快进的
我的问题是:如何使git使用fetch all branch拉取
,并自动快进所有跟踪分支?
注意:git pull
用于使用我的GitHub repos快进我的所有跟踪分支,但现在我已经使用Gitolite建立了自己的repos,出现了这个问题。但是请稍候:
- 除非首先签出分支,否则git不会合并(在
部分之后的获取
的第二步)文件。见“git pull
上的git pull将合并master
上的文件,这意味着下一次推送将是快进推送。非快进只能发生master
注:Git 2.0(2014年第2季度)将引入配置push.ff:
pull.ff::
默认情况下,在合并作为当前提交的后代的提交时,Git不会创建额外的合并提交。相反,当前分支的尖端是快进的
- 当设置为
时,此变量告诉Git在这种情况下创建一个额外的合并提交(相当于从命令行提供false
选项)李>--no ff
- 当设置为
时,只允许这样的快进合并(相当于从命令行提供only
选项)。--ff only
例如,如果切换到某个分支,则具有自动合并来自跟踪分支的更改的选项。这应该做你想实现的事情。 如果你真的想快速跟踪跟踪远程分支的所有本地分支,你可能想考虑把这个作为一个别名添加到你的代码>~/.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
。Shell脚本,该脚本快速转发将其上游分支设置为匹配的原始分支/分支的所有分支,而不进行任何签出
- 它在任何时候都不会更改您当前的分支,无需处理工作副本更改和签出时所损失的时间
- 它只进行快进,不能快进的分支将显示错误消息并将被跳过
git branch-vv
,确保所有分支的上游分支都设置正确。使用git branch-u origin/yourbanchname设置上游分支
将粘贴复制到文件和chmod 755:
#/垃圾箱/垃圾箱
curbranch=$(git rev parse--abbrev ref HEAD)
对于以美元为单位的分支(每个ref/heads的git——format=“%(refname:short)”);做
upbranch=$(git config--get branch.$branch.merge | sed's:refs/heads/:');
如果[“$branch”=“$upbranch”];然后
如果[“$branch”=“$curbranch”];然后
echo快进当前分支$curbranch
git合并--仅限ff来源/$upbranch
其他的
echo快进$branch与origin/$upbranch
git获取。原产地/$upbranch:$branch
fi
fi
完成;
如果可能,以下一行程序将快进所有具有上游分支的分支,否则将打印错误:
git branch \
--format "%(if)%(upstream:short)%(then)git push . %(upstream:short):%(refname:short)%(end)" |
sh
它是如何工作的?
它使用带有git分支
命令的自定义格式。对于具有上游分支的每个分支,它将打印一条具有以下模式的线:
git push . <remote-ref>:<branch>
为此,您可以使用常规的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' -
别名是“快进跟踪(分支)”的缩写。我刚刚编写了一个小工具来实现这一点
此工具的优点:
支持一个存储库中的多个远程设备。(hub sync
目前不支持多个遥控器。)
支持在本地分支和相应的远程跟踪分支上使用不同的名称
比为每个分支获取远程数据的其他脚本快得多
没有易出错的正则表达式解析/编辑
您能显示您正在使用的确切命令吗?在master
分支上执行git推送
应该推送除您的master分支之外的任何内容,如果您尚未对master进行任何更改,则不应该尝试推送。我不确定您的工作流是什么,但我的直接反应是,如果您不执行任何操作,则不需要创建本地跟踪分支处理它们(即,它们可以快速转发的情况);远程跟踪分支(origin/*
)会自动更新,在任何情况下都可供您参考。@CharlesBailey举个例子:多个开发人员共享一组分支,并且至少偶尔会对所有分支进行操作,但通常在拉更新时,大多数分支都可以快进。注意:Git2.0将有助于确保只拉ff(仅快进)。请参阅签出的可能重复项可能不受欢迎,因为它需要更新工作树,这可能会触发IDE中的更新或监视文件的任何其他内容。为了避免这种情况,您可以使用updateref
,如下所示:我天真地猜测跟踪分支
[alias]
fft = !sh -c 'git branch --format \"%(if)%(upstream:short)%(then)git push . %(upstream:short):%(refname:short)%(end)\" | sh' -