自动修剪与Git获取或拉

如果有人删除了一个远程分支,因为工作已经结束,我不知道,我不会做git fetch --prune,最终我会推回被删除的分支。

是否有一个可行的解决方案来强制Git在获取/提取时使用修剪模式,而不必每次都指定它?

151322 次浏览

如果你想在fetch时总是prune,我可以建议使用别名

只需输入git config -e打开编辑器,更改特定项目的配置,并添加如下部分

[alias]
pfetch = fetch --prune

当你用git pfetch获取时,修剪将自动完成。

git 1.8.5(2013年第四季度):

"git fetch"(因此也是"git pull")学会了检查"fetch.prune"和"remote.*.prune"配置变量,并像给出"--prune"命令行选项一样行事。

这意味着,如果你设置remote.origin.prune为true:

git config remote.origin.prune true

任何git fetchgit pull将自动修剪。

注意:Git 2.12(2017年Q1)将修复与此配置相关的错误,该错误将使git remote rename行为不当 看到“如何重命名一个git远程?”。< / p >

详见提交737年c5a9:

如果没有"git fetch --prune",另一方已经删除的分支的远程跟踪分支将永远存在 有些人想总是运行"git fetch --prune".

为了满足那些想要总是修剪或从特定远程获取时修剪的用户,添加两个新的配置变量"fetch.prune"和"remote.<name>.prune":

  • "fetch.prune"允许为所有获取操作启用剪枝。
  • "remote.<name>.prune"允许改变每个远程的行为。

后者自然会覆盖前者,命令行中的--[no-]prune选项将覆盖配置的默认值。

由于--prune是一个潜在的破坏性操作(Git还没有为已删除的引用保留reflogs),我们不想在没有用户同意的情况下进行修剪,因此默认情况下这个配置不会开启。

git config --global fetch.prune true

在你所有的Git存储库中,git fetchgit pull总是--prune:

git config --global fetch.prune true

上面的命令在你的全局Git配置(通常是~/.gitconfig)中添加以下几行。使用git config -e --global查看全局配置。

[fetch]
prune = true

git config remote.origin.prune true

总是--prune,但来自一个存储库:

git config remote.origin.prune true
#^^^^^^
#replace with your repo name

上面的命令在你的本地Git配置(通常是.git/config)中添加下面最后一行。使用git config -e查看您的本地配置。

[remote "origin"]
url = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
fetch = +refs/heads/*:refs/remotes/origin/*
prune = true

你也可以在第二个命令中使用--global,或者在第一个命令中使用--local


git config --global gui.pruneDuringFetch true

如果你使用git gui,你可能还会对以下内容感兴趣:

git config --global gui.pruneDuringFetch true

附加:

[gui]
pruneDuringFetch = true

参考文献

git help config中的对应文档:

--global

 对于写入选项:写入全局~/.gitconfig文件而不是存储库.git/config,如果该文件存在而~/.gitconfig文件不存在,则写入$XDG_CONFIG_HOME/git/config文件。

,

--local

 对于写入选项:写入存储库.git/config文件。这是默认行为。

,

fetch.prune

 如果为true,则fetch将自动像在命令行中给出--prune选项一样行事。另见remote.<name>.prune

,

gui.pruneDuringFetch

 如果git-gui在执行取回时应该修剪远程跟踪分支,则返回true。系统默认值为false。

,

remote.<name>.prune

 当设置为true时,默认情况下,从这个远程获取也将删除远程上不再存在的任何远程跟踪引用(就像在命令行上给出--prune选项一样)。覆盖fetch.prune设置(如果有的话)。

最终我将推回删除的分支

这是我认为你应该解决的问题。如果你配置了git,让它推送你不想推送的分支,这可能是个问题。我个人更倾向于只在显式指定想要推送的分支时才推送分支。

有关如何在git存储库中配置推送设置的指导,请参阅https://stackoverflow.com/a/948397/3753318