0

私は比較的gitに慣れていません。リモート リポジトリとして bitbucket を使用しています。すべてのブランチをタグに変換しようとした後、ちょっと面倒な状況になりました。bitbucket にブランチと同じ名前のタグがある状態です。不要なリモート ブランチを削除したい。

ローカルには、私が欲しいものがあります:

> git branch
* master

> git tag
1.1.0
1.2.0
1.3.0
1.3.1
1.3.2
2.0.1

ここまでは順調ですね。

ただし、bitbucket では、次のようなものがあります。

枝:

1.1.0
1.2.0
1.3.0
1.3.1
1.3.2
2.0.1
master

タグ:

1.1.0
1.2.0
1.3.0
1.3.1
1.3.2
2.0.1

master 以外のすべてのリモート ブランチを削除したい。どうすればいいですか?

ありがとう。

4

3 に答える 3

1

リモートオブジェクトを削除するには、何もプッシュする必要はありません — たとえば、

git push origin :master

リモートリポジトリで「マスター」と名付けられたものをすべて削除します。

真実は、ここでの「マスター」は、「refs/heads/master」であるその参照の完全な本名のショートカットにすぎないということです。タグは「refs/tags」名前空間にあるため、リモート リポジトリにブランチと「foo」という名前のタグの両方がある場合は、削除するオブジェクトの完全な名前を使用してあいまいさを取り除くことができます。

詳細はgitrevisions(7)マニュアルページに記載されています。

したがって、master 以外のすべてのリモート ブランチを削除するには、次のようにする必要があります。

git push origin :refs/heads/1.1.0 :refs/heads/1.2.0 ...

ちょっとしたシェルハックを採用することで、この退屈さを軽減することができます:

$ ( while read b; do echo :refs/heads/$b; done | xargs git push origin )
1.1.0
1.2.0
1.3.0
1.3.1
1.3.2
2.0.1
^D

(ここでの ^D はctrl-d、サブシェルへの入力の終わりを知らせるために押すことを意味します)。


PS ちなみに、Git はフェッチ時にワイルドカード refspec をサポートしているので、

git fetch origin '+refs/heads/*:refs/heads/*'

それはプッシュにも機能します。しかし、そうではないようです - 少なくとも

git push origin ':refs/tags/*'

Git 1.8.1 ではうまくいかないようです。

于 2013-03-31T18:40:04.093 に答える
0

リモート ブランチ/タグを削除する構文は次のとおりです。

git push REMOTE_NAME :BRANCH_NAME

同じ名前の場合、タグまたはブランチが優先されるかどうかはよくわかりません。

より具体的には、refs/headsrefspec 指定子を使用してブランチであることを指定できます。

git push REMOTE_NAME :refs/heads/BRANCH_NAME

リモートの名前が であると仮定するとorigin、このコマンドは、言及したすべてのブランチを削除する必要があります。

for branch_name in 1.1.0 1.2.0 1.3.0 1.3.1 1.3.2 2.0.1; do
    git push origin :refs/heads/$branch_name
done
于 2013-03-31T18:41:35.773 に答える