我克隆了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
或类似内容?
答案 0 :(得分:3)
git config -e
将调出您的编辑器(来自$GIT_EDITOR
或core.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/zork
或git 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/*
。
我不确定上述任何内容是否会删除我系统上已存在的引用。
如果您不使用heads
(remotes/origin
)获取或其等价物(--prune
相当于 2 获取),在遥控器上消失的引用是不在本地删除。如果您执行使用-p
,或运行明确的git remote update
,则的引用将在本地删除。我不确定(还没有测试过)这是如何工作的明确的,非-p
- ed refspecs只带来一个有限的分支子集,但我怀疑他们被保留,以及所有的分支没带过来。 (但你可以测试一下:只需更新你的配置文件,只带来你想要的分支,然后看看git remote prune origin
或*
是否删除其他分支。)
参考可以同时出现在git remote prune origin
和git 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
子命令正确修剪。