Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.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_Git Branch - Fatal编程技术网

如何删除所有已集成的远程git分支?

如何删除所有已集成的远程git分支?,git,git-branch,Git,Git Branch,在工作中,我们使用主题分支,这些分支在某个时候被集成到几个(3)主分支中。 现在我想从我的远程存储库中删除所有主题分支,这些分支已经完全集成到主分支中。如果不可能,检索已集成的本地分支的列表也可以。另一个答案由认为它是最好的(而且看起来不错)的人编辑而成。: git branch -r --merged origin/master | grep -v master | grep "origin/" | cut -d "/" -f 2- | xargs -n 20 git push --delet

在工作中,我们使用主题分支,这些分支在某个时候被集成到几个(3)主分支中。
现在我想从我的远程存储库中删除所有主题分支,这些分支已经完全集成到主分支中。如果不可能,检索已集成的本地分支的列表也可以。

另一个答案由认为它是最好的(而且看起来不错)的人编辑而成。

git branch -r --merged origin/master | grep -v master | grep "origin/" | cut -d "/" -f 2- | xargs -n 20 git push --delete origin
说明:

  • git分支-r--合并的源/主
    • -r
      /
      --remotes
      列出远程跟踪分支
    • --合并的源代码/主代码
      仅列出其提示可从
      源代码/主代码
      访问的分支
  • grep-v master
    从列表中删除任何包含
    master
    的分支名称。1
    -v
    表示负匹配
  • grep“origin/”
    仅选择
    origin
    remote上的分支
  • cut-d/-f2-
    删除
    origin/
    前缀
  • xargs-n20git推送--删除源文件
    执行类似于
    git推送--删除源文件分支-a分支-b分支-c…
    • -n20
      /
      --max args=20
      每个命令行最多使用20个参数
至于
-n
,我选择20作为例子。更少的参数会使它变慢,例如
-n1
会使它一次删除一个;您有更多的进度提示,因为它将在每次删除分支时报告。更多像
-n200
这样的参数会使它更快(总时间更短),但它只会每200个分支报告一次,这使您认为它一开始是冻结的(而实际上不是)。根据需要调整号码。如果省略此选项,则默认数字非常大(在我的机器中为2048)

一,。请注意,这也会删除
origin/HEAD->origin/master
,但无论如何,您都不想弄乱
origin/HEAD

原始答案:

git push --delete remote topicbranch


给出一个分支列表,可能是git branch的一些东西——合并的master

您可以一次完成这项工作

git branch --merged master | grep -v master | xargs -n 1 git push --delete origin

如果发现经常这样做,请将其转储到名为“clean”的脚本中。

如果要从源存储库中删除远程分支:

git branch -r --merged develop | egrep -iv '(master|develop)' | sed 's/origin\///g' | xargs -n 1 git push --delete origin

这些是我用来删除所有合并到
origin/master
中的内容的命令。基本上,我从GitHub中删除了所有合并到
master
中的分支

git remote update -p &&
git branch -r --merged origin/master |
grep origin |
grep -v master |
cut -d"/" -f2- |
xargs git push origin --delete

仅适用于Powershell和windows用户

    git branch -r --merged  | findstr /v "origin/master" | %{git push origin --delete $_.Trim().Substring(7)}

对于Windows机箱,我使用此PowerShell oneliner每周在构建系统上使用Windows计划任务清理所有合并的远程git分支:

git branch --all --merged remotes/origin/master | Select-String -NotMatch "master" | Select-String -NotMatch "HEAD" | Select-String "remotes/origin/" | Foreach-Object { $_.ToString().Replace("remotes/origin/", "").Trim() } | Foreach-Object { git.exe push origin --delete $_ }

备注:它结合了大多数已经给出的答案,但没有限制分支清理的数量。

谢谢,
git branch--merged
看起来不错。不幸的是,它不能与在集成过程中被重定基础的分支正常工作。。但是,至少我的一些分支(160个)被列为超级安全的删除分支。。。这可能是可能的,但至少需要shellscript,它将在分支点之后拉取修订列表,然后沿主分支查找修补程序签名。。。我不知道有任何预先煮好的解决方案。这太棒了,尽管我遇到了一个小问题。我用
/
命名分支机构,例如,我的分支机构名称之一可能是
sf/correct-typo-7
。由于cut上的
-f3
参数,此分支名称将被截断为
sf
。将参数更改为
-f3-
,可以纠正此问题并处理带有任意斜杠数的分支。为什么每次删除一个?如果我们批量删除(通过删除
-n1
)会怎么样?@FranklinYu,说不出来,有人故意破坏了我的答案,给它添加了一个“正确”的答案。可能是因为您需要在每个分支之前添加
--delete
?并不是说我每天都进行批量删除……如果您想删除所有远程分支,而不仅仅是那些有本地对应分支的分支:
git branch-a——合并的remotes/origin/master | grep-v master | grep“remotes/origin/“| cut-d”/“-f3 | xargs-n1 git push——删除origin
。另外,我建议使用
remotes/origin/master
代替普通
master
,以排除您在本地合并但尚未推送的内容,以防您最终忘记或决定不推送。@skalee谢谢!这对我来说很有效,除非分支位于文件夹中-请改用
cut-d/-f3-
。我还必须添加一个
grep-v develop
来阻止它试图删除我的开发分支。
xargs-n 1
太慢了,如果有很多分支,请使用
xargs-n 20
来代替。最好解释一下它们在做什么。这也有助于在分叉之后删除所有上游分支。这是真正正确的答案:),由于其他人似乎无法删除包括斜杠在内的分支,我们使用(混合使用)feature/my feature,bugfix/my FeatureUratis看起来相当不错,但使用origin/master或origin/develope作为删除某些内容的标准非常重要。仅仅因为您将某个分支合并到主分支的本地版本中,就从远程删除该分支是不合适的,您可能忘记将该分支推送到远程,这可能意味着从源位置删除未合并的分支。
git branch --all --merged remotes/origin/master | Select-String -NotMatch "master" | Select-String -NotMatch "HEAD" | Select-String "remotes/origin/" | Foreach-Object { $_.ToString().Replace("remotes/origin/", "").Trim() } | Foreach-Object { git.exe push origin --delete $_ }