2017-09-01 8 views
2

私が単独で作業していると仮定し、リモートをコードバックアップソリューションとして使用します。ローカルブランチを削除する可能性があります。ローカルに存在しないリモートブランチを削除する

リモコンの特定のブランチをgit push origin --delete mybranchで削除できますが、ローカルに存在しないブランチを手動で確認することなく、ローカルに存在しないリモートブランチをすべて削除する方法がありますか?

+1

これを行うスクリプトを作成してください。 'git for-each-ref'(Gitのリモートトラッキングブランチを更新するには' git fetch --prune'で始まります)を使います。 – torek

+0

@torekは正しいですが、これはおそらく最善の方法ですが、これは一般的なプラクティスの正反対なので、コードを保持したくないユースケースは何ですか? – LightBender

+0

@ LightBender私は通常ローカルコミットを行い、次にすべてのブランチをリモートにプッシュします。オフラインで作業しているときに、ブランチをマージし、古い(マージされた)ブランチを削除することがあります。ただし、古い(マージされた)ブランチは引き続きリモートに存在します。私はこの種のワークフローのためにローカルとリモートを同期させる方法を探しています。 – Flux

答えて

1

オフラインで作業するときに、ブランチをマージし、古い(マージされた)ブランチを削除することがあります。

あなたはpush --delete, as in this answerをフォローアップすることができますようそれは、オンラインそうするのがベストです:

git branch -r --merged | grep -v master | sed 's/origin\///' | xargs -n 1 git push --delete origin 

しかし、あなたは(オフライン)ローカルブランチを削除するので、オンライン、あなたはfetch --pruneし、必要GitHubからのリモートブランチ、ローカルカウンターパートが存在するかどうかをチェックし、それ以外の場合はpush --deleteをチェックします。

使用git for-each-ref with the refname:lstrip=3 formatこれらのリモートブランチの短い名前をリストアップするために:

git for-each-ref --format='%(refname:lstrip=3)' refs/remotes/origin 

あなたは、あなたは簡単に2を組み合わせることができますgit show-ref --quiet

local branch does exists
if git show-ref --quiet refs/heads/develop; then 
    echo develop branch exists 
fi 

かどうかを確認することができます。

git fetch --prune 
for branch in $(git for-each-ref --format='%(refname:lstrip=3)' refs/remotes/origin); do 
    if ! git show-ref --quiet refs/heads/${branch}; then 
     echo "delete remote branch '${branch}'" 
     git push origin --delete ${branch} 
    fi 
done 
関連する問題