827

私は 2 台の異なるコンピューター (A と B) で作業しており、共通の git リモートをドロップボックス ディレクトリに保存しています。

master と devel の 2 つのブランチがあるとします。両方とも、対応するリモートの origin/master と origin/devel を追跡しています。

コンピューター A で、ローカルとリモートのブランチ devel を削除します。

git push origin :heads/devel
git branch -d devel

コンピューター A で実行git branch -aすると、次のブランチのリストが表示されます。

  • 主人
  • 原点/HEAD
  • オリジン/マスター

git fetchコンピューター B で実行している場合、ローカルの devel ブランチgit branch -d develは削除できますが、リモートの devel ブランチは削除できません。

git push origin :heads/devel次のエラー メッセージを返します。

エラー: 修飾されていない宛先にプッシュできません: ヘッド/proxy3d
宛先 refspec は、リモートの既存の ref と一致せず、refs/ で始まっていません。また、ソース ref に基づいてプレフィックスを推測できません。
致命的: リモート エンドが予期せず電話を切りました

git branch -aリモートブランチに origin/devel をリストします。

コンピューター B からリモート ブランチをクリーンアップするにはどうすればよいですか?

4

9 に答える 9

1443

まず、git branch -aマシン B での結果はどうなるでしょうか。

2 番目に、 は既に削除さheads/develれてoriginいるため、マシン B からは削除できません。

試す

git branch -r -d origin/devel

また

git remote prune origin

また

git fetch origin --prune

--dry-runステートメントの最後に自由に追加して、git実際に実行せずに実行結果を確認してください。

git remote pruneおよびのドキュメントgit branch

于 2010-07-06T08:45:46.127 に答える
143

実行することを検討してください:

git fetch --prune

各リポジトリで定期的に、削除されたリモート ブランチを追跡していたローカル ブランチを削除します (リモート GIT リポジトリにはもう存在しません)。

これは、次のようにさらに単純化できます。

git config remote.origin.prune true

これは、per-repo未来git fetch or git pullが自動的にプルーニングされるようにする設定です。

ユーザー用にこれを設定するには、グローバル .gitconfig を編集して追加することもできます

[fetch]
    prune = true

ただし、これは次のコマンドを使用して行うことをお勧めします。

git config --global fetch.prune true

またはシステム全体に適用する(ユーザーだけでなく)

git config --system fetch.prune true
于 2017-05-23T08:35:36.003 に答える
14

これを実行できるbashスクリプトを次に示します。http://snippets.freerobby.com/post/491644841/remove-merged-branches-in-gitスクリプトの修正版です。私の変更により、さまざまな遠隔地をサポートできるようになります。

#!/bin/bash

current_branch=$(git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/')
if [ "$current_branch" != "master" ]; then
  echo "WARNING: You are on branch $current_branch, NOT master."
fi
echo -e "Fetching merged branches...\n"

git remote update --prune
remote_branches=$(git branch -r --merged | grep -v '/master$' | grep -v "/$current_branch$")
local_branches=$(git branch --merged | grep -v 'master$' | grep -v "$current_branch$")
if [ -z "$remote_branches" ] && [ -z "$local_branches" ]; then
  echo "No existing branches have been merged into $current_branch."
else
  echo "This will remove the following branches:"
  if [ -n "$remote_branches" ]; then
echo "$remote_branches"
  fi
  if [ -n "$local_branches" ]; then
echo "$local_branches"
  fi
  read -p "Continue? (y/n): " -n 1 choice
  echo
  if [ "$choice" == "y" ] || [ "$choice" == "Y" ]; then
    remotes=`echo "$remote_branches" | sed 's/\(.*\)\/\(.*\)/\1/g' | sort -u`
# Remove remote branches
for remote in $remotes
do
        branches=`echo "$remote_branches" | grep "$remote/" | sed 's/\(.*\)\/\(.*\)/:\2 /g' | tr -d '\n'`
        git push $remote $branches 
done

# Remove local branches
git branch -d `git branch --merged | grep -v 'master$' | grep -v "$current_branch$" | sed 's/origin\///g' | tr -d '\n'`
  else
echo "No branches removed."
  fi
fi
于 2012-03-16T14:24:46.173 に答える
14

このコマンドはoriginmaster. これを変更するか、マスターの後にブランチを追加できます。grep -v for-example-your-branch-here |

git branch -r --merged | 
  grep origin | 
  grep -v '>' | 
  grep -v master | 
  xargs -L1 | 
  awk '{sub(/origin\//,"");print}'| 
  xargs git push origin --delete --dry-run

良さそうな場合は、 を取り外します--dry-run。さらに、最初にフォークでこれをテストすることをお勧めします。

于 2016-10-24T19:51:05.903 に答える
3

SourceTree (v2.3.1) でそれを行う方法は次のとおり です
。 1. Fetch をクリックし ます 。


ここに画像の説明を入力

于 2016-06-06T10:04:02.493 に答える