11

新しいリモートをローカル リポジトリに追加して取得したところ、新しいリモートからすべてのブランチが取得されました。興味のないブランチが 1 つありますgit fetch <new remote>

そのようなリモート ブランチのフェッチを停止するにはどうすればよいですか?

私はやっgit branch -d -r <new remote>/<non-wanted branch>たが、それぞれでそれを再取得するのをやめるためにもっと何かをする必要があるgit fetch <new remote>.

4

2 に答える 2

6

opatut が指摘したように、リモートのブランチ参照を「取得しない」ことにはほとんどメリットがありません。気にしないものを使用しないでください。

それらを使用することを主張する自動化されたものがある場合 [編集: 特定のブランチをブラックリストに登録したい -ホワイトリストに登録したいだけの場合は、以下を参照]、2 つの回避策があります。

  • 毎回それらを削除します(後で何かをする必要がありますgit fetch
  • 以下に説明するトリックを使用します( の後に何かをする必要もありますgit fetch

「リモート ブランチ」は単に形式の参照です。ここで、 はリモートの名前 (例: )で、 はブランチの名前 (例: ) です。それらを作成するのは、レポのファイルに表示される次の行です (実行してエディターで表示します)。refs/remotes/rmt/brrmtoriginbrmaster.git/configgit config -e

fetch = +refs/heads/*:refs/remotes/origin/*

これはgit fetch、一致するすべての ref 名を取得してrefs/heads/*それらを更新する必要があることを示しています (強制的に、+文字のために — そうしないと早送り更新に制限されます)、refs/remotes/origin/*その*部分が明らかに一致する名前を に変更します。

したがって、これを次のように変更すると:

fetch = +refs/heads/*:refs/real-remotes/origin/*

操作はの代わりにgit fetch更新 (または必要に応じて作成)します。refs/real-remotes/originrefs/remotes/origin

その後、次のことができます。

git for-each-ref refs/real-remotes/origin/

これらすべての ref を ( で使用可能なすべてのオプションを使用してgit for-each-ref) 列挙し、それらをスクリプトで実行して、ブラック リストに登録されているものを削除し、残りのものをrefs/remotes/origin/. 例えば:

git for-each-ref refs/real-remotes/origin/ |
while read sha1 reftype refname; do
    shortname=${refname#refs/real-remotes/origin/}
    if [ $shortname != master ]; then
        git update-ref refs/remotes/origin/$shortname $sha1
    fi
done

これにより、(これは非常に奇妙なことですが、実行したばかりです) を除く すべてが更新されます。master(補足: いわば、シンボリックなリモート ref を「ハードリンク」します。たとえば、 thisHEADである a がある場合、ref: ref/remotes/origin/masterそれが参照するものに変わります。そのような参照をgit symbolic-refテストするために使用しますが、それはアップしています見つかったらどうするかはあなた次第です。)

(これと、特定のリモート ブランチを明示的に削除することとの主な違いは、このバージョンでは、リモート ブランチを更新せずにそのままにしておくことです。たとえば、これは移動せずに残しますorigin/master。「実際の」リモート マスターは現在、 にのみ存在しrefs/real-remotes/origin/masterます。)

[編集: 特定のブランチをホワイトリストに登録したい場合は、それらを明示的にリストしてください:

fetch = +refs/heads/master:refs/remotes/origin/master
fetch = +refs/heads/devel:refs/remotes/origin/devel

fetch =必要な数の行を使用します。ただしgit fetch、リモートにこれらのブランチのいずれかが存在しない場合は、エラーが発生することに注意してください。]

于 2013-09-18T04:33:59.293 に答える
3

そうしない。取得しないメリットはありません。参照<remote>/<branch-name>が追加され、必要に応じて使用できますが、使用する必要はありません。とにかくすべてのオブジェクトがフェッチされるため、パフォーマンスやストレージ サイズの改善はありません。

そのリモートのブランチを無視してください。ローカル ブランチはこの影響を受けません。

ご存じない場合: リモート ブランチは.git/refs/remotes/<remote-name>/<branch-name>、コミット ID を含む のファイルにすぎません。このファイルはあなたに害を及ぼすべきではありません:)

于 2013-09-18T03:26:35.397 に答える