【问题标题】:Automatic prune with Git fetch or pull使用 Git fetch 或 pull 自动修剪
【发布时间】:2013-08-20 22:32:16
【问题描述】:

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

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

【问题讨论】:

  • 您将很快(git 1.8.5,2013 年第四季度)能够在您想要始终git fetch 上修剪的仓库的本地配置中指定!见my answer below

标签: git


【解决方案1】:

如果您想在fetch 时始终使用prune,我可以建议使用Aliases

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

[alias]
pfetch = fetch --prune   

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

【讨论】:

  • 我明白了。顺便拉一下会用 git fetch 而不是 git pfetch ……要不要直接给拉取个别名?
  • 我会的。这样,您就有了两种选择,普通的pullfetch 以及它们的修剪版本。实际上,我认为(但我没有尝试过)你可以直接在别名部分写fetch = fetch --prune,因此pull 将自动使用修剪后的提取
  • 据我所知fetch = fetch --prune 不起作用,用别名覆盖命令对我不起作用。这可能是因为我使用的是旧版本(1.7.2.5)
  • 来自 git config 文档:“为避免混淆和脚本使用麻烦,隐藏现有 Git 命令的别名将被忽略。”
【解决方案2】:

Since git 1.8.5 (Q4 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 行为不端。
见“How do I rename a git remote?”。


commit 737c5a9查看更多信息:

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

为了满足希望始终修剪或在从特定远程获取时进行修剪的用户,请添加两个新的配置变量“fetch.prune”和“remote.<name>.prune”:

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

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

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

【讨论】:

  • 这确实包含在现在发布的git 1.8.5中
  • 我希望在我的所有 git 存储库中默认出现这种行为。有没有什么地方我可以把它放在我的 .gitconfig 中来实现这一点?
  • @Andrew 一个好的开始应该是git config --global fetch.prune true
  • 在拉取时总是修剪可能的缺点是什么?引用提到 reflog 历史受到影响......但这可能会带来什么实际问题?
  • @Grapho 没有真正的缺点,但是...在stackoverflow.com/a/39862779/6309查看更多信息
【解决方案3】:

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 config -egit config -e --global。不再需要输入 vim 命令来指向 git 配置文件的特定路径,并且不必考虑该特定路径是什么。
  • 现在这是您可以使用的答案。非常感谢。
  • 这个答案非常彻底,但由于其格式而很难阅读。我会发现“在所有 Git 存储库中始终 --prune for git fetch 和 git pull:git config --global fetch.prune true”同样好(带有相关文档的链接)。
【解决方案4】:

最终我会推回删除的分支

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

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

【讨论】:

    猜你喜欢
    • 2020-02-12
    • 2016-10-08
    • 1970-01-01
    • 1970-01-01
    • 2013-05-26
    • 2011-11-02
    • 2018-03-05
    • 2020-07-27
    相关资源
    最近更新 更多