2017-07-15 107 views
2

这里,我们有有多个分支,其具有相同前缀就这样开始混帐回购协议:Git的 - 重命名多个分支

pfx.branchName1 
pfx.branchName2 
pfx.branchName3 
... 

所以现在的问题是如何快速删除所有前缀(“PFX。 “),从所有的树枝,得到这样的:

branchName1 
branchName2 
branchName3 
... 

回答

1

找到一个通用的命令,搜索其中含有我们所期望的字符串的分支(例如"StringToFind"),并重新命名与我们想要的字符串(如"ReplaceWith")替换一部分:

git branch | grep "StringToFind" | awk '{original=$1; sub("StringToFind","ReplaceWith"); print original, $1}' | xargs -n 2 git branch -m 

注:开始重命名之前,我们可以运行这个命令来查看哪些分支要改名(只是为了方便) :

git branch | grep "StringToFind" | awk '{original=$1; sub("StringToFind","ReplaceWith"); print original, "->" , $1}' 

所以对于我们的情况使用这种去除前缀:

git branch | grep "pfx." | awk '{original=$1; sub("pfx.",""); print original, $1}' | xargs -n 2 git branch -m 

而这种去除之前检查:“^ PFX \”

git branch | grep "pfx." | awk '{original=$1; sub("pfx.",""); print original, "->", $1}' 
+0

我给你的命令也是“通用的”,并且更安全:在分支名称的开头匹配前缀,即使在分支名称中使用特殊字符也是安全的,运行更少的进程并且更简单。 – janos

+0

顺便说一句,如果你想在删除之前检查,更简单的方法是在'git'命令之前插入'echo',例如'xargs -n 2 echo git branch -m' – janos

2

您可以从git branch, 的输出滤波器的分支名,然后使用一个循环猛砸与置换进行重命名:

git branch | sed -e 's/..//' | grep '^pfx\.' | while read b; do git branch -m "$b" "${b#pfx.}"; done 

或稍微更紧凑,但也许难以阅读:

git branch | sed -ne 's/^..pfx\.//p' | while read b; do git branch -m "pfx.$b" "$b"; done 
+0

由于省略了''grep的,第二种方法是假设所有分支开始'pfx',不是吗? –

+0

@JoaoDelgado感谢您发现,我忘记为's ///'命令添加'p'标志,现在已经修复。 (没有那个标志,实际上没有东西会从'sed'打印出来,所以没有重命名。) – janos

+0

我不知道'git branch -m'。酷招。 –