使用git fetch或pull自动修剪

Edm*_*984 222 git

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

是否有可行的解决方案强制git在获取/拉取时使用剪枝模式而不必每次都指定它?

Von*_*onC 356

自git 1.8.5(2013年第4季度):

" git fetch"(因此" git pull"也学会了检查" fetch.prune"和" remote.*.prune"配置变量,并表现得好像给出了" --prune"命令行选项.

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

git config remote.origin.prune true
Run Code Online (Sandbox Code Playgroud)

任何git fetchgit pull将自动修剪.

注意:Git 2.12(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不保留已删除引用的reflog),我们不希望在没有用户同意的情况下进行修剪,因此默认情况下不会启用此配置.

  • @Andrew一个好的开始将是`git config --global fetch.prune true` (41认同)
  • 这确实包含在现已发布的git 1.8.5中 (4认同)
  • 总是在拉动时修剪可能有哪些缺点?引用提到引用历史记录受到影响......但这可能会带来什么实际问题? (3认同)
  • @Grapho没有真正的缺点,但是...请参见/sf/answers/2790394561/ (2认同)

oli*_*bre 123

git config --global fetch.prune true

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

git config --global fetch.prune true
Run Code Online (Sandbox Code Playgroud)

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

[fetch]
    prune = true
Run Code Online (Sandbox Code Playgroud)

git config remote.origin.prune true

总是--prune来自一个单一的存储库:

git config remote.origin.prune true
                 #^^^^^^
                 #replace with your repo name
Run Code Online (Sandbox Code Playgroud)

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

[remote "origin"]
    url = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    fetch = +refs/heads/*:refs/remotes/origin/*
    prune = true
Run Code Online (Sandbox Code Playgroud)

您也可以--global在第二个命令中使用或--local在第一个命令中使用.


git config --global gui.pruneDuringFetch true

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

git config --global gui.pruneDuringFetch true
Run Code Online (Sandbox Code Playgroud)

附加:

[gui]
    pruneDuringFetch = true
Run Code Online (Sandbox Code Playgroud)

参考

相应的文件来自git help config:

--global

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

 

--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 config -e”和“git config -e --global”。不再需要输入“vim”命令来指向 git 配置文件的特定路径,并且必须考虑该特定路径是什么。 (2认同)

Tha*_*ish 19

如果你想永远prune在你身边fetch,我建议你使用别名.

只需键入git config -e即可打开编辑器并更改特定项目的配置,并添加类似的部分

[alias]
pfetch = fetch --prune   
Run Code Online (Sandbox Code Playgroud)

当您使用git pfetch修剪获取时将自动完成.

  • 从git配置文档:"为避免混淆和使用脚本的麻烦,隐藏现有Git命令的别名将被忽略." (3认同)
  • 据我所知`fetch = fetch --prune`不起作用,用别名覆盖命令对我来说不起作用.这可能是因为我使用的是旧版本(1.7.2.5) (2认同)