38

多くのブランチがあるため、オリジンからすべてのブランチをフェッチしたくありません。いくつか (例: ) と自分のブランチ (サブディレクトリのmaster下に編成)を追跡したいだけです。my_name私は次のことができます:

$ git fetch origin refs/heads/my_name/*:refs/remotes/origin/my_name/* refs/heads/master:refs/remotes/origin/master refs/heads/some_branch:refs/remotes/origin/some_branch

上記の refspecs の「セット」を のデフォルトに指定したいと思いますgit fetch。私が試してみました

$ git config remote.origin.fetch refs/heads/my_name/*:refs/remotes/origin/my_name/*
$ git config --add remote.origin.fetch refs/heads/master:refs/remotes/origin/master

失敗します:

$ git config remote.origin.fetch
refs/heads/my_name/*:refs/remotes/origin/my_name/*
error: More than one value for the key remote.origin.fetch: refs/heads/master:refs/remotes/origin/master

私も次のことを試みますが、失敗します:

$ git config remote.origin.fetch 'refs/heads/my_name/*:refs/remotes/origin/my_name/* refs/heads/master:refs/remotes/origin/master refs/heads/some_branch:refs/remotes/origin/some_branch'
$ git fetch
fatal: Invalid refspec 'refs/heads/my_name/*:refs/remotes/origin/my_name/* refs/heads/master:refs/remotes/origin/master refs/heads/some_branch:refs/remotes/origin/some_branch'

注: Git 1.7.11

4

4 に答える 4

43

次の行を に追加して、.git/configフェッチ用に複数の refspec を指定できます。

[remote "origin"]
       fetch = refs/heads/my_name/*:refs/remotes/origin/my_name/*
       fetch = refs/heads/master:refs/remotes/origin/master
       fetch = refs/heads/some_branch:refs/remotes/origin/some_branch

+次のように、非早送り参照のフェッチもオーバーライドしたい場合は、refspec の前にプレフィックスを追加できます。

[remote "origin"]
       fetch = +refs/heads/my_name/*:refs/remotes/origin/my_name/*
       fetch = +refs/heads/master:refs/remotes/origin/master
       fetch = +refs/heads/some_branch:refs/remotes/origin/some_branch

部分的なグロビングはサポートされていないことに注意してください (つまりa/b/ca*、サポートされていませんが、サポートされていa/b/*ます)。

10.5 Git の内部 - Refspec

于 2013-03-19T19:31:20.080 に答える
4

注: 1 回の呼び出しで別の refspec からフェッチする場合(config に登録されているフェッチ refspec を一時的にオーバーライドする)、Git 2.1 (2014 年 8 月) 以降で実行できます。

Junio C Hamano ( )によるコミット c5558f8を参照してください。gitster

f269048 ( fetch: opportunistically update tracking refs, 2013-05-11)頃に開始されたリモート追跡ブランチの日和見更新の導入以来、 v1.8.4 時代にいくつかの更新が行われ、refspec を指定する場合でも構成が常に開始されますremote.*.fetch何を取得するかはコマンドラインで指定され、呼び出しごとに無効にしたり上書きしたりする方法はありません

refmap として--refmap=<lhs>:<rhs>構成されたの使用をオーバーライドするために使用できるコマンドライン オプションに注意を払うようにコマンドを教えます。remote.*.fetch

これにより、新しいオプションが提供されます。

--refmap=<refspec>

remote.*.fetchコマンド ラインにリストされた参照を取得する場合、リモート リポジトリの構成変数の値ではなく、指定された refspec (複数回指定可能) を使用して、参照をリモート追跡ブランチにマップします。
詳細については、「構成済みのリモート追跡ブランチ」のセクションを参照してください。

(その Git の「Configured Remote-tracking Branches」セクションも Git 2.1 にさかのぼります。「理解に苦しむgit fetch」を参照してください)


Git 2.25.1 (2020 年 2 月) では、"git fetch --refmap=" オプションのドキュメントが改善されました。

Derrick Stolee ( )によるコミット b40a502 (2020 年 1 月 21 日)を参照してください。( 2020 年 1 月 30 日コミット 4b69f29Junio C Hamanoによってマージされました)derrickstolee
gitster

fetch: ドキュメントとテスト --refmap=""

署名者: Derrick Stolee

' ' 通話中の長時間のブロックを防ぐために、ユーザーはバックグラウンド ' ' プロセスgit fetchのスケジュールを設定することができます。 ただし、これらの実行は、Git がリモートを追加するときに設定で設定されたデフォルトの refspec により、refs/remotes ブランチを更新します。 したがって、ユーザーは、フォアグラウンド フェッチ中にリモート ref が更新されても気付かないでしょう。実際、最後のフォアグラウンド fetch 呼び出しからの参照を操作できるように、それらの参照をそのままにしておきたい場合があります。git fetch

--refmap=これは、カスタム refspec とともに' ' を使用して構成済みの refspec をオーバーライドすることで実現できます。

git fetch --refmap='' <remote> +refs/heads/*:refs/hidden/<remote>/*

カスタム ref スペースを設定し、新しい到達可能なオブジェクトのパックをダウンロードします。
この種の呼び出しでは、いくつかのことが起こります。

  1. 参照が更新された場合、新しいパックをダウンロードします。2. refs/hidden ブランチが存在するため、GC は新しくダウンロードされたデータを削除しません。
  2. 有効にfetch.writeCommitGraphすると、refs/hidden refs を使用して commit-graph ファイルが更新されます。

refs/hidden ディレクトリが際限なくいっぱいになるのを避けるために、この--pruneオプションを含めることができます。このような refspec を提供する場合、--pruneオプションはリモート ref を削除せず、代わりにターゲット refspace 内の ref のみを削除します。

ドキュメントを更新して ' --refmap=""' の動作を明確にし、テストを作成して、この動作が今後も維持されることを保証してください。

そのため、git fetchオプションの man ページには次のものが含まれるようになりました。

--refmap=<refspec>:

remote.*.fetchコマンド ラインにリストされた参照を取得する場合、リモート リポジトリの構成変数 の値ではなく、指定された refspec (複数回指定可能) を使用して、参照をリモート追跡ブランチにマップします。

オプションに空<refspec>--refmap指定すると、Git は構成された refspec を無視し、コマンドライン引数として指定された refspec に完全に依存します。詳細については、「構成済みのリモート追跡ブランチ
」の セクションを参照してください。


過去 7 年間に行ったリモート追跡ブランチへのより積極的な更新は、Git 2.27 (Q2 2020) で修正されたドキュメントに反映されていないことに注意してください。

コミット a440884コミット f6a65de (2020 年 4 月 5 日) by Philippe Blain ( phil-blain)を参照してください。
( 2020 年 4 月 22 日、コミット fdee8b1Junio C Hamanoによってマージされました)gitster

pull doc: 例の古い説明を修正

署名者: Philippe Blain

f269048754 (" : opportunisticallyfetch update tracking refs", 2013-05-11, Git v1.8.4-rc0 --バッチ #0にリストされているマージ) 以降、 git pullの基盤は、構成されたリモート追跡ブランチを更新します。git fetch[](https://git-scm.com/docs/git-pull) <remote> <branch>

ただし、ドキュメントの「例」セクションの例ではgit pull、そうではないことが示されています。

この例の説明を訂正してください。

代わりに、 for git pull origin next:

これにより、next一時的に のコピーが FETCH_HEAD に残りますが、リモート追跡ブランチは更新されません。
リモート追跡ブランチを使用すると、fetch と merge を呼び出すことで同じことができます。

あなたは今持っています

これにより、next一時的に のコピーが FETCH_HEAD に残り、リモート追跡ブランチが更新origin/nextされます。
fetch と merge を呼び出すことで、同じことができます。

于 2014-08-02T18:12:40.097 に答える