仅跟踪现有遥控器上的特定分支

时间:2014-04-17 09:41:43

标签: git

我克隆了sage repository,它包含了很多分支。目前,所有这些分支都被跟踪:每当我git fetch origin时,我都会获得许多新创建的分支。我想避免这种情况,但不知道如何。

我想我可以移除然后重新添加origin遥控器,使用git remote add -t master …将一个特定分支替换为glob来跟踪。但是我有点担心这会对我当地的分支机构做些什么,这些分支机构应该追踪原点。

我还在fetch文件中看到了遥控器的.git/config设置:

[remote "origin"]
    url = git://trac.sagemath.org/sage.git
    fetch = +refs/heads/*:refs/remotes/origin/*

我可以编辑该文件,但我不知道这样做是否安全,我发现没有命令行工具以安全的方式修改此文件。

我不确定上述任何内容是否会删除我系统中已存在的引用。如果没有,我想知道是否只是删除.git/refs/remotes/origin下的文件就足够了。或者我是否必须通过git branch -r -D或类似内容?

1 个答案:

答案 0 :(得分:3)

git config -e将调出您的编辑器(来自$GIT_EDITORcore.editor$VISUAL$EDITOR或已编译的默认设置(按此顺序)你的.git/config。但是直接编辑它是很好的(至少在类Unix系统上 - 我没有在Windows上尝试过这种方法)。

git fetch origin无法为所有远程分支创建本地跟踪分支,只有"远程分支"当地分支机构可以跟踪。

通常情况下,如果git创建了许多这样的远程分支,人们似乎并不关心那么多。远程分支(实际上是本地的,因此名称具有误导性:它们是远程上看到的普通分支的本地副本)存储在单独的名称空间中(ref/remotes/origin/ ,在这种情况下),所以他们不会干扰你自己的当地分支机构;没有git branch-a的{​​{1}}隐藏它们;因此,如果只有一个-r或数千个origin/master,那就不是那么大了。但是,由于origin/whatever允许初始配置,或编辑配置文件(直接,或使用git remote add,或使用各种单独的git config -e命令),您确实可以更改此内容。

如果取消远程分支,主要效果是您无法查看或跟踪本地副本。这意味着,即使"他们"设置git config分支,如果zork git checkout zork无法与zork匹配并创建跟踪分支。但与此同时,你也无法origin/zork,因为你没有带来git checkout -b zork --track。 (一个微不足道的好处是,你不会带来只需要你也不会带来的远程分支所需的对象。通常这很简单。)

运行普通origin/zorkgit fetch(而不是git fetch origin)时,git fetch origin branch命令会读取所有fetch中的refspec列表远程条目下的行。所以:

fetch =
允许

并导致[remote "origin"] url = git://trac.sagemath.org/sage.git fetch = +refs/heads/develop:refs/remotes/origin/develop fetch = +refs/heads/master:refs/remotes/origin/master 使用这两个字符串作为其两个refspec。

Fetch通过向遥控器询问所有其引用(git fetch origin,即所有头部,标签,注释以及可能存在的任何内容)并复制到您的仓库中来实现其功能 1 与左侧refspec部分匹配的那些(冒号左侧的东西)。每个匹配的ref必须由右侧重写,结果必须只是一个refspec。 (例如,如果您要求它将refs/*转换为refs/heads/master并将refs/remotes/origin/master转换为refs/heads/master,则它无效。)您可以使用{{ 1}}匹配refspec组件,包括整个尾随部分,因此refs/remotes/origin/their-master匹配所有分支 - 分支是*下的任何引用 - 而refs/heads/*替换refs/heads/部分refs/remotes/origin/*

  

我不确定上述任何内容是否会删除我系统上已存在的引用。

如果您使用headsremotes/origin)获取或其等价物(--prune相当于 2 获取),在遥控器上消失的引用是在本地删除。如果您执行使用-p,或运行明确的git remote update,则的引用将在本地删除。我不确定(还没有测试过)这是如何工作的明确的,非-p - ed refspecs只带来一个有限的分支子集,但我怀疑他们被保留,以及所有的分支没带过来。 (但你可以测试一下:只需更新你的配置文件,只带来你想要的分支,然后看看git remote prune origin*是否删除其他分支。)

参考可以同时出现在git remote prune origingit fetch -p origin中(这也是一个可编辑的文本文件)。您应该可以使用.git/refs/或完全手动删除它们(正如您所建议的那样)(后者通常更快更容易)。


1 .git/packed-refs默认处理标签外。 SHA-1与分支的SHA-1匹配的那些,即远程上git branch refspec的那些,将被分支带来。

如果您提供git fetch,则抓取会将refs/heads/*添加到refspec。由于这不具有--tags,因此这些不是强制更新;但它们的行为与任何其他用户提供的refspec相同,生成的标签会在您的本地标签名称空间中出现(没有内置的"远程标签"名称空间)。

2 由于某种原因,实现refs/tags/*:refs/tags/*的代码与实现+的代码不同,并且在某些版本的git中,某些远程分支可能无法获取由git fetch -p修剪,但如果我正确记住发行说明项目,则会被git remote update -p子命令正确修剪。