如何同步我的本地 git 存储库并删除远程存储库中消失的分支



我见过许多关于这个问题的类似堆栈溢出问题。 我已经尝试了很多方法,但仍然卡住了。

我有一个这样的脚本:

git fetch --prune
for k in $(git branch --merged| grep -E -v "(^*|master|dev|release|origin)"); do
  if [ -z "$(git log -1 --since='38 week ago' -s "$k")" ]; then
    ## Info about the branches before deleting
    git log -1 --format="%ci %ce - %H $k" -s "$k";
    ## Delete from the remote
    # git push origin --delete "$k";
    ## Delete the local branch, regardless of whether it's been merged or not
    # git branch -D "$k"
  fi;
done

明白了:

host:folder user$ clean-up.sh 
2018-05-18 14:46:25 -0700 gituser@company.com - 646766c885324b4f298d55604e0aabc2a00fdb58 feature/some-branch
2018-05-16 19:56:56 -0400 gituser@company.com - 4e09733554eaf5e293ca7c668c19ec1395b361f9 some-other-branch

所以它说以下两个分支要删除:

feature/some-branch
some-other-branch

但它们实际上已经从远程中删除了一段时间。 问题是我的本地存储库仍然有它们。 我已经尝试了许多方法将我的本地存储库与远程同步,以便从远程中删除的分支也将从本地删除。

有人知道一个好的解决方案吗?

更好的解决方案是完全不依赖于本地存储库,并且能够完全依靠远程存储库来清理远程中的旧分支。

我尝试过 git 远程修剪起源,但它不起作用

尝试以下命令:

git remote update origin --prune

学到了一些新东西。 我需要 git 分支 -r 来查看远程分支。 当我这样做时,我需要从分支名称中删除"起源"。 然后,当我想查找有关分支的信息时,我需要重新添加"origin"。 这是对我有用的:

for k in $(git branch -r --merged | sed 's/origin///' | grep -E -v "(^*|master|dev|release|origin)"); do
  if [ -z "$(git log -1 --since='5 week ago' -s "origin/$k")" ]; then
    ## Info about the branches before deleting
    git log -1 --format="%ci %ce - %H $k" -s "origin/$k";
    ## Delete from the remote
    git push origin --delete "$k";
    ## Delete the local branch, regardless of whether it's been merged or not
    # git branch -D "$k"
  fi;
done

一个衬里

git branch -d $(git branch -vv  | grep ': gone]' | cut -d' ' -f3)

这将删除已消失的本地分支,但会保留尚未合并的分支。如果您也不需要这些,请使用 -D 代替。

git version 2.32.1 (Apple Git-133)上测试

最新更新