我有一个带有远程分支结构的Git存储库,如下所示:
bugfix001
bugfix002
feature
feature001
feature002
feature003
master
task
task001
task002
其中'feature'和'task'是分支结构中的文件夹,'feature001','feature002'分支位于父'feature'分支文件夹下。
我的问题是 - 是否可以重命名'feature'父文件夹并保留其下的所有分支。所以我可以将它重命名为'hamster',结构看起来像这样
hamster
feature001
feature002
feature003
为了清楚起见,我不是指本地文件结构,这是远程的分支结构。要在'feature'文件夹下添加分支,我会使用:
git checkout -b feature/feature004
我意识到我可以单独重命名每个子分支并推送到远程但是我可以重命名'feature'父文件夹,这将导致子分支遵循新名称吗?
答案 0 :(得分:3)
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
答案 1 :(得分:2)
正如其他人发布的那样,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 / '。
任何从此回购中撤出的人都必须为重命名的分支设置跟踪,因为之前的分支将不再存在。
答案 2 :(得分:2)
如果在名称中使用/
命名分支,则会在refs/heads
中创建目录。例如,名为feature/feature001
的分支创建名为refs/heads/feature/
的目录,其中包含文件feature001
。如果重命名feature
目录,则实际上是重命名以feature/
开头的每个分支(以packed-refs
为模)。这不是重命名分支的推荐方法,但它确实有效。您需要编辑配置文件以重新连接指定跟踪分支的任何分支。除此之外,再次忽略packed-refs
中的任何内容,你可以做你想要的。
答案 3 :(得分:1)
在git中,您可以使用斜杠(/
)以您想要的方式命名分支。这些斜杠不要引用文件夹分隔。因此,如果要重命名以“feature”开头的所有分支,则必须手动为每个分支执行此操作。
使用相同的前缀可以帮助您列出某些分支子集;像这样:
git branch --list "feature/*"
但不仅仅是那个afaik。