【问题标题】:Getting rid of the repository name prefix from branches从分支中删除存储库名称前缀
【发布时间】:2018-04-08 15:48:33
【问题描述】:

我使用以下方法将整个 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/)前缀?

【问题讨论】:

    标签: git github


    【解决方案1】:

    只需git checkout foo。就是这样。

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

    签出本地不存在但远程存在的分支会自动为您创建此分支,因此只需执行签出但省略 origin/ 部分。

    【讨论】:

    • 有没有办法一次检出所有这些(一个接一个)来为每个人创建一个本地分支?
    • this 是您要找的吗?
    • @sawa:您可以使用链接的答案来做到这一点;但总的来说你不应该;它现在不会让你的事情变得更容易,最终会让你的事情变得更难,因为现在你有一大堆本地分支,你必须经常更新或修剪。最好让git fetch 自动更新您的远程跟踪分支,并仅在您开始处理它们时制作本地副本。
    • 我感觉git clone --mirror 在对@tkausl 提供的链接的回答中建议的是(接近)我正在寻找的东西。
    • 这不适用于我没有在本地创建的分支。我无法在没有 origin/ 前缀的情况下签出分支,并且我得到的 pathspec 与任何已知文件都不匹配。使用 origin/ 作为前缀可以正常工作,但会将前缀保留在分支名称中。 git 版本 2.21.0.windows.1
    【解决方案2】:

    简短的回答是“不,你甚至不应该尝试”。

    远程跟踪分支名称不是分支,尽管名称为“远程跟踪分支名称”。相反,它是您的 Git 对某些 other Git 分支名称的记忆。这有多种用途,包括能够这些远程跟踪名称创建您自己的分支名称。

    在 Git 中,分支或标签名称,如 masterv1.1,是 Git 提供的一种设备,可让您将人类可读的名称分配给(一个,单个)哈希 ID。这些哈希 ID 通常是提交的 ID。 (通常的异常发生在标签上,它可以命名标签对象,然后命名提交;这就是 Git 实现带注释的标签的方式。)

    (本地)分支名称的特别之处在于它们具有独特的属性,您可以通过使用分支名称运行 git checkout 来“了解它们”。一旦你这样做了,git status 会说像on branch master 这样的话。而且——这是 真正 的特殊技巧——如果你现在进行 new 提交,Git 将自动将新提交的哈希 ID 存储在当前分支名称,即你“在”的那个。

    作为另一个特殊技巧,如果你告诉 Git 进入某个分支名称 B,而当前分支名称 B不存在,Git 将扫描你的远程跟踪集名称,例如 origin/masterorigin/B。如果它找到恰好一个这样的名称,它将:

    • 创建一个新名称B
    • 指向与origin/B相同的提交
    • 并设置为 track origin/B

    (这些术语特别不幸:一个本地分支名称“tracks”一个“remote-tracking”分支名称,它是根据 remote 命名的,然而这些东西中的每一个都是本地!)。

    每次您运行git fetch origin,您的Git 都会调用另一个Git,其URL 与名为originremote 关联。另一个 Git 告诉你的 Git 它现在有哪些分支名称,以及这些名称对应的提交 ID。您的 Git 会下载任何新的提交,并且此时会更新您的远程跟踪名称以匹配其名称,从而更新您的 Git 对其 Git 中内容的记忆。因此,即使您确实设法使用远程跟踪名称做某事,您也会在每个 git fetch 上付出所有努力。

    请注意,一旦您有一个名为 B 的分支,它就完全独立于您的 origin/B 发生的事情,除非您指示您的 Git 做一些事情以与您的 origin/B 重新同步。你可以在git fetch 之后执行此操作,首先将origin/Borigin 的Git 同步,然后将Borigin/B 同步。

    (Git 提供了两步“同步,然后再次同步”作为便利命令,git pull,但对于刚开始使用 Git 的任何人,我建议避免使用此命令——它做的太多,有时很差;而且当某些事情发生时失败,它会让您陷入无法恢复的混乱状态,因为您不知道哪个步骤失败并且无法阅读特定于该步骤的正确文档!)

    【讨论】:

    【解决方案3】:

    它们是远程分支。他们需要origin/ 前缀,它告诉远程仓库他们属于哪里。

    在本地 repo 上,您需要创建本地分支来跟踪远程分支。有几种方法可以做到:

    git branch foo origin/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 branchgit checkoutgrepxargs

    【讨论】:

    • 这是一个比接受的更好的响应。谢谢!
    【解决方案4】:

    您可以在checkout 期间重命名您的分支并使用如下别名:

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

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

    git cb foo
    git cb bar
    

    【讨论】:

      猜你喜欢
      • 2017-06-12
      • 1970-01-01
      • 2021-11-23
      • 2011-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-29
      • 2018-10-27
      相关资源
      最近更新 更多