从分支中删除仓库名称前缀

3

我使用以下命令将整个GitHub存储库克隆到本地计算机:

git clone git@github.com:my_account_name/my_repository_name.git

假设我在远程仓库上有名为foobar的分支。当我执行以下操作时:
git branch -r

我的本地计算机上存储的远程分支以以下名称列出:

origin/foo
origin/bar

(同时使用 git branch -a 命令,它们会带有进一步前缀为 remotes/ 的标识。) 当我在本地计算机上处理分支时,我想引用没有 origin/ 前缀的分支。对于每个分支,我可能可以执行以下操作:

git branch -m origin/foo foo

我希望重命名分支,但实际上我有很多分支,不想一个一个手动操作。有没有一种方法可以一次性在本地计算机上移除多个远程分支的 origin/(或 remotes/origin/)前缀?

4个回答

3

只需执行git checkout foo。就是这样。

你不应该重命名或在origin/*分支中工作,它们跟踪远程仓库的状态。你不直接在它们上面工作,而是创建本地副本。

检出一个本地不存在但远程存在的分支会自动为你创建此分支,因此只需执行检出操作,但省略origin/部分即可。


有没有一种方法可以一次性检出所有这些代码(一个接一个地),以便为每个代码创建本地分支? - sawa
1
这是您要找的内容吗?链接 - tkausl
1
@sawa:你可以使用链接的答案来完成这个任务;但一般情况下,你不应该这样做;因为它现在并没有让事情变得更容易,而且最终会让事情变得更加困难,因为现在你有了一堆本地分支,你需要不断地更新或修剪。最好让git fetch自动更新你的远程跟踪分支,并在开始工作时只制作本地副本。 - torek
我有一种感觉,@tkausl提供的链接中建议使用git clone --mirror命令(接近)是我正在寻找的。 - sawa
这对于我本地未创建的分支无效。我不能在没有origin/前缀的情况下检出分支,而且我会收到“pathspec与任何已知文件不匹配”的错误提示。使用origin/作为前缀可以正常工作,但分支名称中会保留前缀。Git版本为2.21.0.windows.1。 - Radu C

2
简短的答案是“不行,你甚至不应该尝试”。
“远程跟踪分支名称”并不是一个分支,尽管它被称为“远程跟踪分支名称”。相反,它是你的 Git 记忆中另一个 Git 的分支名称。这有几个目的,包括创建自己的分支名称从这些远程跟踪名称。
在 Git 中,分支或标签名称(如 master 或 v1.1)是 Git 提供的一种设备,让你为一个(单一的)哈希 ID 分配一个可读的名称。这些哈希 ID 通常是提交的 ID。(正常的例外情况出现在标签上,它们可以命名标记对象,然后命名提交;这是 Git 实现注释标签的方法。)
使(本地)分支名称特殊的是它们具有唯一的属性,即您可以通过使用分支名称运行 git checkout "进入" 它们。一旦你这样做了,git status 将会显示像 "on branch master" 这样的东西。而且 - 这是真正的特殊技巧 - 如果你现在创建一个新的提交,Git 将自动将新提交的哈希 ID 存储在当前分支名称中,即你正在 "on" 的那个分支名称。
作为另一个特殊技巧,如果你告诉 Git 进入一些分支名称 B,并且分支名称 B 目前不存在,则 Git 将扫描你的远程跟踪名称集合,例如 origin/master 和 origin/B。如果它找到恰好一个这样的名称,它将:
- 创建一个新的名称 B
- 指向与 origin/B 相同的提交
- 并设置为跟踪 origin/B
(这些术语特别不幸:本地分支名称“跟踪”“远程跟踪”分支名称,根据远程命名,并且每一个这些东西都是本地的!)
每次运行 git fetch origin 时,你的 Git 调用另一个 Git,在与名为 origin 的远程关联的 URL 上。其他 Git 告诉你的 Git 它现在有哪些分支名称,以及这些名称所对应的提交 ID。你的 Git 下载任何新的提交,并在此时更新你的远程跟踪名称以匹配它们的名称,更新你的 Git 对其 Git 中的内容的记忆。因此,即使你使用远程跟踪名称做了一些事情,每次 git fetch 都会抹掉你所有的努力。
请注意,一旦您有了一个名为B的分支,它就与您的origin/B无关,除非您指示Git执行某些操作以重新与您的origin/B同步。您可以在git fetch之后执行此操作,先将origin/Borigin上的Git同步,然后将您的B与您的origin/B同步。
(Git提供了两步“同步,然后再次同步”的便捷命令git pull,但对于任何刚开始使用Git的人,我建议避免使用此命令-它做得太多,有时做得不好;当某些事情失败时,它会让你陷入无法恢复的混乱状态,因为你不知道哪一步失败了,也不能阅读正确的文档,这是特定于那一步的!)

一篇很好的说明上述观点的文章是"Git:fetch和merge,不要pull" - kostix

1
他们是远程分支。它们需要origin/前缀,这告诉远程仓库它们属于哪个分支。
在本地仓库中,您需要创建本地分支来跟踪远程分支。有几种方法可以完成这个任务:
git branch foo origin/foo

创建名为foo的本地分支,指向远程仓库origin上的foo分支所指向的提交。如果你想开始在foo上工作,则必须执行git checkout foo命令。但你也可以将两个命令合并成一个命令。
git checkout -b foo

如果只有一个名为foo的远程分支,git checkout会将其识别出来(它是origin/foo),并在内部运行上述列出的前两个命令的等效命令。
如果您不需要所有远程分支,可以使用以下命令逐个删除它们:
git remote -d -r origin/foo

-d 表示“删除”,-r 告诉它分支是一个远程分支。

你可以一次删除多个分支,但它不接受通配符。然而,你可以结合使用 git branch --listgrep 来获取要删除的分支的名称:

git branch -r --format '%(refname:lstrip=2)' | grep 'foo*' | xargs git remote -d -r

'foo*'替换为您需要匹配所需分支名称的任何通配符。


阅读更多关于 git branch, git checkout, grepxargs 的内容。


1
这是比被接受的回答好得多的回复。谢谢! - Radu C

0

你可以在 checkout 过程中重命名分支,并像这样使用别名:

cb = !sh -c 'git checkout -b $1 origin/$1' -

之后,您将能够运行如下命令:

git cb foo
git cb bar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接