重命名Git分支文件夹

重命名Git分支文件夹,git,version-control,Git,Version Control,我有一个Git存储库,其远程分支结构如下: bugfix001 bugfix002 feature feature001 feature002 feature003 master task task001 task002 git branch --list "feature/*" 其中,“功能”和“任务”是分支结构中的文件夹,“功能001”、“功能002”分支位于父“功能”分支文件夹下 我的问题是-是否可以重命名“feature”父文件夹并

我有一个Git存储库,其远程分支结构如下:

bugfix001 
bugfix002     
feature
    feature001
    feature002
    feature003
master
task
    task001
    task002
git branch --list "feature/*"
其中,“功能”和“任务”是分支结构中的文件夹,“功能001”、“功能002”分支位于父“功能”分支文件夹下

我的问题是-是否可以重命名“feature”父文件夹并保留其下的所有分支。所以我可以把它改名为“仓鼠”,结构看起来像这样

hamster
    feature001
    feature002
    feature003
我要说的是,我不是指本地文件结构,这是远程服务器上的分支结构。要在“功能”文件夹下添加分支,我将使用:

git checkout -b feature/feature004

我意识到我可以单独重命名每个分支并推送到远程,但是我可以重命名“feature”父文件夹吗?这会导致分支跟随新名称吗?

在git中,您可以使用斜杠(
/
)或不使用斜杠,以您想要的方式命名分支。这些斜杠表示文件夹分隔。因此,如果您想重命名所有以“feature”开头的分支,您必须手动为每个分支重命名

使用相同的前缀可以帮助您列出分支的某些子集;像这样:

bugfix001 
bugfix002     
feature
    feature001
    feature002
    feature003
master
task
    task001
    task002
git branch --list "feature/*"

不过也没什么大不了的。

在git中,您可以使用斜杠(
/
)或不使用斜杠,以您想要的方式命名分支。这些斜杠表示文件夹分隔。因此,如果您想重命名所有以“feature”开头的分支,您必须手动为每个分支重命名

使用相同的前缀可以帮助您列出分支的某些子集;像这样:

bugfix001 
bugfix002     
feature
    feature001
    feature002
    feature003
master
task
    task001
    task002
git branch --list "feature/*"
但也没什么比这更重要的了。

git中没有“分支文件夹”这样的东西

您只有命名的分支,并且您正在使用的名称恰好包含一个斜杠,它提醒人们文件夹结构;但它也可能是其他东西(例如,
@

总结:您必须重命名每个分支,并推送新的分支名称(并删除旧的分支名称)

但这应该足够简单:

remote=origin
for branch in $(git branch --list "feature/*")
do
 newbranch="hamster/${branch#feature/}"
 # locally create new branch based on old one
 git checkout "${branch}"
 git checkout -b "${newbranch}"
 # push the new branch to the remote
 git push --set-upstream "${remote}" "${newbranch}"
 # delete old branch remotely and locally
 git push "${remote}" ":${branch}"
 git branch -d "${branch}"
done
git中没有“分支文件夹”这样的东西

您只有命名的分支,并且您正在使用的名称恰好包含一个斜杠,它提醒人们文件夹结构;但它也可能是其他东西(例如,
@

总结:您必须重命名每个分支,并推送新的分支名称(并删除旧的分支名称)

但这应该足够简单:

remote=origin
for branch in $(git branch --list "feature/*")
do
 newbranch="hamster/${branch#feature/}"
 # locally create new branch based on old one
 git checkout "${branch}"
 git checkout -b "${newbranch}"
 # push the new branch to the remote
 git push --set-upstream "${remote}" "${newbranch}"
 # delete old branch remotely and locally
 git push "${remote}" ":${branch}"
 git branch -d "${branch}"
done

正如其他人所说,Git中没有文件夹概念,这些只是名称。您唯一的选择是逐个重命名它们。脚本可以帮助完成此操作-以下是重命名本地分支的示例:

for i in $(git branch --list 'feature/*') ; do
    echo "$i"
    # Cut off the first part
    newbranch=new/$(basename "$i")

    # Rename the existing branch
    git branch -m "$i" "$newbranch"

    # Push the new branche
    git push origin "$newbranch"

    # Delete the old branch from the remote
    git push origin :"$newbranch"
done
这将把所有匹配“feature/”的分支重命名为“new/”


任何从该回购中退出的人都必须为重命名的分支机构设置跟踪,因为以前的分支机构将不再存在。

正如其他人所发布的,Git中没有文件夹概念,这些只是名称。您唯一的选择是逐个重命名它们。脚本可以帮助完成此操作-以下是重命名本地分支的示例:

for i in $(git branch --list 'feature/*') ; do
    echo "$i"
    # Cut off the first part
    newbranch=new/$(basename "$i")

    # Rename the existing branch
    git branch -m "$i" "$newbranch"

    # Push the new branche
    git push origin "$newbranch"

    # Delete the old branch from the remote
    git push origin :"$newbranch"
done
这将把所有匹配“feature/”的分支重命名为“new/”


从该回购中提取的任何人都必须为重命名的分支机构设置跟踪,因为以前的分支机构将不再存在。

当您在名称中使用
/
命名分支机构时,将在
参考/heads
中创建一个目录。例如,名为
feature/feature001
的分支创建名为
refs/heads/feature/
的目录,其中包含一个文件
feature001
。如果重命名
功能
目录,实际上就是重命名以
功能
开头的每个分支(对
压缩引用
中的任何内容进行模化)。这不是重命名分支的推荐方法,但确实有效。您需要编辑配置文件以重新连接指定跟踪分支的任何分支。除此之外,再次忽略
packed refs
中可能存在的任何内容,您可以按要求执行操作。

当您在名称中使用
/
命名分支时,将在
refs/heads
中创建一个目录。例如,名为
feature/feature001
的分支创建名为
refs/heads/feature/
的目录,其中包含一个文件
feature001
。如果重命名
功能
目录,实际上就是重命名以
功能
开头的每个分支(对
压缩引用
中的任何内容进行模化)。这不是重命名分支的推荐方法,但确实有效。您需要编辑配置文件以重新连接指定跟踪分支的任何分支。除此之外,再次忽略
压缩引用中可能存在的任何内容,您可以按自己的要求执行操作。

您最好使用shell脚本一次重命名一个分支。您最好一次重命名一个分支,使用shell脚本。使用
basename
剥离类路径组件的好技巧;如果你有多个斜杠的标签,它可能不会达到你所期望的效果:
/feature/gui/foo
feature/network/foo
都将被重命名为
new/foo
,这是真的-它只会保留最后一部分完好无损;如果你有多个斜杠的标签,它可能不会达到你期望的效果:
/feature/gui/foo
feature/network/foo
都将被重命名为
new/foo
,这是真的-它只会保留最后一部分不变。这很有趣,但听起来很可怕。这很有趣,但听起来很可怕