使用Git获取或拉取自动修剪


248

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

是否有一种可行的解决方案,可以强制Git在获取/拉取时使用prune模式,而不必每次都指定它?


1
您很快就会(2013年第四季度git 1.8.5)可以在要始终修剪的仓库的本地配置中指定git fetch!请参阅下面的答案
VonC

Answers:


395

从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(Q1 2017)将修复与此配置相关的错误,这可能会导致git remote rename行为不端。
请参阅“ 如何重命名git遥控器? ”。


commit 737c5a9上查看更多信息

如果没有“ git fetch --prune”,则另一端已删除的分支的远程跟踪分支将永远保留。
有些人希望始终运行“ git fetch --prune”。

为了适应那些希望一直修剪或从特定远程获取信息的用户,请添加两个新的配置变量“ fetch.prune”和“ remote.<name>.prune”:

  • fetch.prune”允许为所有提取操作启用修剪。
  • remote.<name>.prune”允许更改每个遥控器的行为。

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

由于这--prune是一种潜在的破坏性操作(Git尚未为已删除的引用保留引用日志),所以我们不想在未经用户同意的情况下进行修剪,因此默认情况下不会启用此配置。


4
这确实包含在现在发布的git 1.8.5中
Bessey

1
默认情况下,我要在所有git存储库中使用此行为。有什么地方可以将其放入.gitconfig来实现的吗?
安德鲁(Andrew)

47
@Andrew的一个好的开始是git config --global fetch.prune true
VonC

1
总是在拉动时修剪的潜在缺点是什么?引文中提到reflog历史记录受到影响...但是这可能会带来什么实际问题?
Grapho

3
@Grapho没有真正的缺点,但是...请参见stackoverflow.com/a/39862779/6309
VonC

142

git config --global fetch.prune true

要始终--prunegit fetchgit pull所有Git仓库的位置:

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,写到$XDG_CONFIG_HOME/git/config文件(如果此文件存在而~/.gitconfig文件不存在)。

 

--local

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

 

fetch.prune

  如果为true,则提取将自动执行,就像--prune在命令行中给出了该选项一样。另请参阅remote.<name>.prune

 

gui.pruneDuringFetch

  如果git-gui在执行提取操作时应修剪远程跟踪分支,则为“ true” 。默认值为“ false”。

 

remote.<name>.prune

  设置为true时,默认情况下从此远程获取还将删除远程上不再存在的所有远程跟踪引用(就像--prune在命令行中提供了该选项一样)。覆盖fetch.prune设置(如果有)。


1
附注:我刚刚了解git config -egit config -e --global这个职位。不再需要键入vim命令来指向git配置文件的特定路径,而不必考虑该特定路径是什么。
ecbrodie '18年

1
现在,这是您可以使用的答案。非常感谢你。
sebingel

这个答案很彻底,但是由于其格式而很难读。我发现“总是-修剪所有Git存储库中的git fetch和git pull:git config --global fetch.prune true”一样好(带有指向相关文档的链接)。
Thibaud Colas

19

如果您想一直prune使用fetch,我建议您使用别名

只需键入git config -e以打开编辑器并更改特定项目的配置,然后添加一个部分,例如

[alias]
pfetch = fetch --prune   

当您使用git pfetch修剪工具时,将自动完成。


我明白。顺便提一下,将使用git fetch而不是git pfetch ...我应该直接为pull使用别名吗?
Edmondo1984

1
我会。通过这种方式,你有两种选择,正常pullfetch他们修剪的版本。实际上,我认为(但我没有尝试过)您可以fetch = fetch --prune直接在别名部分中编写,因此pull将自动使用修剪后的提取
ThanksForAllTheFish 2013年

2
据我所知fetch = fetch --prune不起作用,用别名覆盖命令对我来说不起作用。这可能是因为我使用的是旧版本(1.7.2.5)
Uipko

3
从git config文档中:“为避免混淆和脚本使用麻烦,将忽略隐藏现有Git命令的别名。”
Dewayne Christensen 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.