289

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

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

4

4 回答 4

460

自 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 年第一季度)将修复与此配置相关的错误,该错误会导致git remote rename行为不端。
请参阅“如何重命名 git 遥控器? ”。


在提交 737c5a9中查看更多信息:

如果没有“ git fetch --prune”,另一方已经删除的分支的远程跟踪分支将永远保留。
有些人想一直跑“ git fetch --prune”。

为了适应想要总是修剪或从特定远程获取时想要修剪的用户,请添加两个新的配置变量“ fetch.prune”和“ remote.<name>.prune”:

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

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

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

于 2013-09-10T12:25:39.073 回答
197

git config --global fetch.prune true

始终--prune在您git 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,则 fetch 将自动表现得就像--prune在命令行上给出了选项一样。另请参阅remote.<name>.prune

 

gui.pruneDuringFetch

如果git-gui在执行 fetch 时应该修剪远程跟踪分支,  则为 "true" 。默认值为“假”。

 

remote.<name>.prune

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

于 2016-11-28T10:56:33.820 回答
20

如果你想永远prune当你fetch,我可以建议使用别名

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

[alias]
pfetch = fetch --prune   

当您使用git pfetchprune 获取时将自动完成。

于 2013-08-19T07:56:22.707 回答
2

最终我会推回删除的分支

这是我认为你应该解决的问题。如果您配置了 git 以便它推送您不想推送的分支,这可能是一个问题。我个人更喜欢将其设置为仅在明确指定要推送的分支时才推送分支。

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

于 2021-05-24T16:42:35.743 回答