Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git 从分支中删除存储库名称前缀_Git_Github - Fatal编程技术网

Git 从分支中删除存储库名称前缀

Git 从分支中删除存储库名称前缀,git,github,Git,Github,我使用以下方法将整个GitHub存储库克隆到本地计算机: git clone git@github.com:my_account_name/my_repository_name.git 假设我在远程存储库上的分支是foo和bar。当我这样做时: git branch -r 存储在本地计算机上的远程分支列出了名称: origin/foo origin/bar (对于git branch-a,它们显示时带有remotes/前缀。)当我在本地计算机上处理分支时,我希望引用没有origin/前缀的

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

git clone git@github.com:my_account_name/my_repository_name.git
假设我在远程存储库上的分支是
foo
bar
。当我这样做时:

git branch -r
存储在本地计算机上的远程分支列出了名称:

origin/foo
origin/bar
(对于
git branch-a
,它们显示时带有
remotes/
前缀。)当我在本地计算机上处理分支时,我希望引用没有
origin/
前缀的分支。对于每个分支,我可能会这样做:

git branch -m origin/foo foo

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

只需执行
git checkout foo
。就这样

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


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

您可以在
签出期间重命名分支,并使用如下别名:

cb = !sh -c 'git checkout -b $1 origin/$1' -
之后,您将能够运行以下命令:

git cb foo
git cb bar
简短的回答是“不,你甚至不应该尝试”

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

在Git中,分支或标记名,如
master
v1.1
,是Git提供的一种设备,用于将人类可读的名称分配给(一个,单个)散列ID。这些散列ID通常是提交的ID。(正常的异常发生在标记上,标记可以命名标记对象,然后命名提交;这就是Git实现带注释标记的方式。)

(本地)分支名称的特殊之处在于,它们具有唯一的属性,您可以通过使用分支名称运行
git checkout
来“获取它们”。一旦您这样做,
git status
就会在分支主机上显示
。这是一个非常特别的技巧,如果你现在进行一个新的提交,Git会自动将新提交的哈希ID存储在当前的分支名称中,即你“打开”的分支名称中

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

  • 创建新名称
    B
  • 指向与源站相同的提交
  • 并设置为跟踪
    原点/B
(这些术语尤其不幸:本地分支名称“跟踪”一个“远程跟踪”分支名称,该名称是根据远程名称命名的,但这些名称中的每一个都是本地的!)

每次运行
git fetch origin
,您的git都会在与名为
origin
的远程设备相关联的URL处调用另一个git。另一个Git告诉您的Git它现在有什么分支名称,以及这些名称对应的提交ID。您的Git下载任何新提交,并在此时更新您的远程跟踪名称以匹配它们的名称,更新您的Git内存中的Git内容。所以,即使您确实设法使用远程跟踪名称做了一些事情,您也会在每个
git fetch
上付出所有的努力

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


(Git提供了两步“同步,然后再次同步”作为一个方便的命令,
git pull
,但是对于任何一个开始使用git的人来说,我建议避免使用这个命令,因为它做得太多,有时甚至很糟糕;当某个命令失败时,它会让你陷入一片混乱,你无法恢复,因为你不知道哪个步骤失败了,也无法阅读正确的文档,这是该步骤特有的!)它们是远程分支。它们需要
origin/
前缀,它告诉远程回购它们所属的位置

在本地回购上,您需要创建本地分支以跟踪远程分支。有几种方法可以做到这一点:

git branch foo origin/foo
创建本地分支
foo
,该分支指向远程分支
origin/foo
(远程repo
origin
上的分支
foo

如果您想开始使用
foo
,那么您必须
git checkout foo
。但您只能在一个命令中组合这两个命令:

git checkout -b foo
如果只有一个名为
foo
的远程分支,
git checkout
会识别它(它是
origin/foo
),并在内部运行与上面列出的前两个命令等效的命令

如果不需要所有远程分支,可以使用以下方法(逐个)删除它们:

git remote -d -r origin/foo
-d
是“delete”,
-r
告诉它分支是远程分支

一次可以删除多个分支,但它不接受通配符。但是,您可以将
git branch--list
grep
组合,以获得要删除的分支的名称:

git branch -r --format '%(refname:lstrip=2)' | grep 'foo*' | xargs git remote -d -r
'foo*'
替换为匹配所需分支名称所需的任何通配符