質問: `git clone -b branch1 --single-branch https://xx` でcloneしたローカルリポジトリで、リモートリポジトリから別のブランチを取ってくることはできないでしょうか? 巨大なリポジトリのため、上記の通り`--single-branch`でcloneしたのですが、その後、`branch1`作成後の履歴について`git filter-branch --tree-filter`で歴史改変をすることになりました。しかし、branch1の派生元である`master`がローカルブランチにも追跡ブランチにもない(?)ため、`git filter-branch ~~~ master..HEAD`とすることができません。(`master`は`branch1`作成以降進んでいません) branch1が派生する直前のコミットをしらべて`HEAD~123..HEAD`とすればよいとは思いますが、今後同様の作業を何度か行う予定があり、そのたびにコミットを調べるのはか面倒ですので、`master..HEAD`と指定するために、リモートリポジトリから派生元ブランチだけを持ってくることができないかと考えました。 git初心者のため、的外れな質問になっていましたら申し訳ありません。
回答: 例えば `git clone -b branch1 --single-branch https://foobar.com/test.git` としてcloneしてきた場合、`.git/config` に次のように書かれているかと思います。 ``` [remote "origin"] url = https://foobar.com/test.git fetch = +refs/heads/branch1:refs/remotes/origin/branch1 ``` `--single-branch` なしでcloneした場合は次のようになります。 ``` [remote "origin"] url = https://foobar.com/test.git fetch = +refs/heads/*:refs/remotes/origin/* ``` fetchの設定値が異なりますよね。この設定は次の役割を持っています。 * ブランチ指定なしで fetch した際の対象ブランチを決定する * fetch元(master)しか指定していないときのfetch先(remotes/origin/master)を決定する そのため通常ワイルドカードが使われているブランチ名が、`--single-branch` を指定した場合は単一のブランチに固定されているために、そのブランチしかfetchされなくなるのです。 一つの記述で複数ブランチを指定することはできませんが、`refs = ...` という行を増やせば複数指定することが可能です。 これを踏まえて、masterブランチをfetchするには、 * `git fetch origin master:remotes/origin/master` とfetch先まで明示する ※上の例では通常の構成通り、リモート追跡ブランチ `remotes/origin/master` をfetch先にしていますが、直接ローカルの `master` 等をfetch先に指定しても構いません。 * `.git/config` に `fetch = +refs/heads/master:refs/remotes/origin/master` を追加する = `git fetch` で branch1 と master がfetchされるようになる * `.git/config` で `fetch = +refs/heads/*:refs/remotes/origin/*` に変更する = `--single-branch` をやめる といった方法があります。一回きりにしたいなら1番目の方法がいいと思いますが、今後も最新のmasterを取得する予定があるなら2番目以降が楽ですね。 参考 * How to clone a single branch in git? - Stack Overflow * 10.5 Gitの内側 - Refspec / Git Book * Git - git-fetch Documentation