如何在Git上删除获取的遥控器?

时间:2018-12-28 04:11:02

标签: git github

我已经获取了一些远程分支机构,例如git fetch jason sprint-36。我已经附上了屏幕截图(红色是遥控器):

enter image description here

我将如何停止跟踪/删除列表中的遥控器?例如,四个月前我做了git fetch ken retain-cycle-fix,但我再也不会获取或查看此分支,该如何删除它?

2 个答案:

答案 0 :(得分:0)

要删除诸如remotes/jason/sprint-36remotes/ken/retain-cycle-fix之类的远程跟踪名称,可以使用git branch -r -d

$ git branch -r -d remotes/jason/sprint-36

例如。但是,几乎没有任何理由这样做,因为如果您运行git fetch jason,您将立即重新获得{em> all 您的remotes/jason/远程跟踪名称。

要删除整个遥控器及其所有遥控器名称,请使用git remote removegit remote rm(同一子命令使用两个名称)。

有用的背景知识(所有这些都不是必读的,您可以在这里停止)

这里有几件值得注意的事情,它们都不是问题的直接答案,但对于完整性而言很有用:

  • 首先,Git将这些名称称为远程跟踪分支名称,但它们实际上不是 branches ,因为分支-或至少是分支< em> name -是您可以给git checkout赋予的名称,该名称会导致将HEAD附加到该名称。

    也就是说,在git checkout master之后,或者在您的情况下,在git checkout sprint-41之后,您将位于该分支上。 git status命令将显示on branch branch,您所做的新提交将自动更改该分支名称,以便它指向刚刚进行的新提交。这些远程跟踪名称都不适用,这就是为什么我将它们称为“远程跟踪名称”,而完全删除了 branch 一词。

  • 它们具有全名形式。 remotes/jason/sprint-36的全名实际上是refs/remotes/jason/sprint-36。全名可以缩写,这要归功于the gitrevisions documentation中所述的六步名称解析过程:jason/sprint-36通常有效,如果无效,remotes/jason/sprint-36通常有效,但如果两者均无效在这些作品中,全名形式始终有效。

    出于任何原因,git branch -r列出了缩短版本,没有 remotes/,而git branch -a列出了缩短版本 {{1 }}。

  • 远程跟踪名称的重点是要跟踪远程服务器上的名称,特别是分支名称。因此remotes/更新了这些远程跟踪名称。至少从Git 1.8.4版开始。

  • 与所有引用一样,一个远程跟踪名称仅记录一次提交的哈希ID。如果该提交是来自{strong>任何其他名称的reachable,则远程跟踪名称仅指向该特定提交。如果使用其他任何名称都无法提交该提交,则远程跟踪名称将保持该提交,并且其前任(父代,祖父母等等,从历史倒退)在您的存储库中仍然有效。 (有关可达性的定义,请参见指向http://think-like-a-git.net/的链接。)

    这意味着删除远程跟踪名称将不会节省任何空间,除非该名称是仅 的方式来访问某些占用您存储库中大量空间的提交。如果远程跟踪名称指向由其他提交和/或名称保留的提交,则除git fetch输出中的某些屏幕空间和类似内容外,您肯定不会通过删除它来保存任何内容。 1

  • 运行git branch时,没有其他参数,Git将获取并更新git fetch remote设置中列出的引用(使用remote.remote.fetch查看这些引用)。运行git config --get-all remote.remote.fetch时,git fetch remote refspec1 [refspec2 [...]]仅根据给定的 git fetch 自变量进行更新。


1 从技术上讲,如果当前未打开远程跟踪名称,则可以保存一个磁盘块左右。但是,大多数远程跟踪名称大多是打包的(与许多其他名称一起存储在refspec中。)


使用.git/packed-refs--prune来获取

您可能会定期运行fetch.prunegit fetch来更新git fetch origin的所有远程跟踪名称。 (例如,我这样做。几乎可以随时进行此操作非常安全。)这样做时,您会获得很多远程跟踪名称。

最终,其中一些名称可能会从origin中消失。但是,它们不会自动从您自己的远程跟踪名称中消失。要使它们自动消失,请使用origin或将git fetch --prune origin设置为fetch.prune,这默认为true使用git fetch 。将此处的--prune替换为originjason等任何远程对象,以通过修剪来更新所有内容。 (但是,如果您不希望更新所有内容,请不要执行任何操作-这是“多合一”设置,该设置将创建或更新该遥控器的所有远程跟踪名称,同时删除所有无效的名称。 )

参考规范,或更多有关您正在运行的ken的信息

在上述示例之一中,您运行了:

git fetch

这使用git fetch jason sprint-36 作为参考规范。 refspec通常由用冒号分隔的两个名称组成,例如sprint-36。省略冒号和第二个名字有一些特殊之处-refs/heads/master:refs/remotes/origin/mastergit fetch有所不同。对于git push,省略冒号意味着在两侧都使用相同的名称,但是对于git push,这意味着请勿在我这一侧使用任何名称

这是事情变得奇怪的地方,也是为什么我不得不在这些要点之一中提到Git 1.8.4和1.8.4及更高版本。这里有一个历史古怪的地方。

每个 git fetch将有关获取了哪些名称以及相应的Git对象哈希ID的信息写入git fetch中名为.git的特殊文件中。该文件与引用几乎相同,但不完全相同,因为它可以而且经常确实包含多行,每行中不仅包含哈希ID。本质上,FETCH_HEADgit fetch的输出开始(在您的遥控器上尝试-它只是将内容打印到终端窗口中),弄清楚要获取的内容,然后在{{1 }}。

在糟糕的过去,当Git特别难以使用时,这是唯一{em> 的地方git ls-remote保存其信息。您必须立即找出所有有用的东西并自己保存。 .git/FETCH_HEAD脚本为您完成了此操作。 仍然有效,因为与Intel一样,Git家伙喜欢将“ backwards”保​​持在“ backwards-compatible”。

从Git 1.8.4开始,这一切都发生了变化:Git学会了使用该远程设备的git fetch设置来更新相应的远程跟踪分支。

同时-从那时起至今仍然如此-如果您使用两个名字的形式,例如:

git pull

fetch将尝试使用左侧名称git fetch jason sprint-36:rhs 来写取(与从git fetch溢出的列表匹配,使其变为sprint-36 )到您自己的存储库中的分支或标签或其他名称。在这里,我使用git ls-remote jason作为右侧名称。此名称不是完全限定的(例如,不以refs/heads/sprint-36开头),并且当前在存储库中可能不存在该名称,因此Git将使用rhs提示从您的refs/heads/远程计算机在您自己的存储库中创建一个新分支refs/heads/

只要您的Git为1.8.4或更高版本,它就会 在此时机会创建或更新jason

因此,使用包含冒号和右侧名称的refspec进行获取可能会在存储库中创建或更新两个引用。通常,一个将是分支名称,例如refs/heads/rhsrefs/remotes/jason/sprint-36。另一个将是远程跟踪名称,例如refs/heads/rhs,可通过refs/heads/sprint-36中的refs/remotes/jason/sprint-36设置进​​行管理。

可以更改remote.jason.fetch设置。如果这样做,这将更改.git/config的操作:在没有引用规范的情况下,Git遵循获取设置。它还可能更改remote.jason.fetch的操作:如果git fetch jason不再映射到远程跟踪名称,则不会创建或更新远程跟踪名称。

无论何时何地都难以使用。 (设计实际上是针对git fetch jason sprint-36克隆的,而不是花哨的用户管理的配置。)尽管如此,这是底层的机制:refspecs通过 refmaps 传递(我不会尝试通过在此处定义,但是在the git fetch documentation中对它们的描述相当不完善,默认情况下是根据每个远程refs/heads/sprint-36设置构建的。

请注意,没有前导加号--single-branch的引用规范,例如fetch非强制更新。仅当更新导致快进操作时,才进行此类更新。实际上,这很有用,因为这意味着您可以从自己的其他分支或远程跟踪名称中快速转发自己的非当前分支。您可以使用+作为远程名称通过sprint-36:rhsgit fetch进行操作,因为git push表示此Git存储库: < / p>

.

或:

.

将快速前进自己的git fetch . refs/remotes/origin/master:refs/heads/master 以匹配您的git push . refs/remotes/origin/master:refs/heads/master ,而不必离开当前的非master分支。 (如果您自己使用origin/master,它将无法正常工作。有一种棘手的方法可以使其正常工作,但不要这样做!)

(您几乎不必在这里拼出完整的分支名称,但是通常以防万一,这是个好主意-当Git与引用不匹配时,这很烦人。)

答案 1 :(得分:0)

如果它也已在遥控器上删除,则只需使用

git fetch --prune

,它将简单地修剪不再位于远程中的所有分支。

另一方面,如果它没有在远程存储库中删除,并且您再也不会提取了,则只需使用

git branch -rd <branch_name>