refファイルをコピーする代わりに(悪い悪い!)使用するgit update-ref
プルする代わりにプッシュするときに、必要なものをベアリポジトリに簡単に保存できることに注意してください。
これを使って:
git clone --mirror . /tmp/bareclone
完全に同期させておきたいベアリポジトリを作成するにはここで、すべてのブランチをベアクローンミラーに同期するには、次を使用します。
git push /tmp/bareclone --mirror
これにより、ソースリポジトリにはないが、(まだ)ベアクローンにあるヘッドもすべて削除されることに注意してください。また、このインターフェイスはかなり低レベルであり、実際にはsend-packによって実装されているため、プッシュする代わりにsend-packを使用できることにも注意してください。
HTH
コメント提供者が指摘したように、私は、逆を行うことは一度には不可能であるように思われるという主題を少し避けました。ただし、次のように少し進んだことを行うことで、目標に向けて長い道のりを歩むことができます。
1.シンプルで、安全で、かなり刺激的ではありません。
git fetch $url -- $(git ls-remote -h $url |
while read sha ref; do echo "$ref:refs/remotes/fetched/${ref#refs/heads/}"; done)
`url = git://your.server/project.git'を設定します。例:
refが適度に安全な場所に作成されていることを確認しました。効果は非常に似ています。
git remote add fetched $url --fetch
したがって、多くはありませんが、配管コマンドを使用してそれを実現する方法を示しているので、これらをニーズに適合させることができます。
2.ローカルブランチ(ヘッド)に直接フェッチします
これで、自分が何をしているかが確実にわかっている場合は、次のスタイルを使用して、ブランチをローカルで複製できます。
git init --bare .
git fetch $url -- $(git ls-remote -h $url |
while read sha ref; do echo "$ref:$ref"; done)
注:更新を強制したい場合(たとえば、アップストリームのリベース、リセット、フィルターブランチ、または修正されたコミット(一般的に-書き換えられた履歴)のために早送りプルがない場合)echo "$ref:$ref"
はecho "+$ref:$ref"
;(Thanks Dov)
3.フルモンティ
これを組み合わせることもできるので、リモート定義も可能です。ローカルブランチが実際にリモートからのものを追跡していることを意味するため、これらの強力なフェッチコマンドを使用してこれらのブランチのローカルコミットの一部を誤って破壊した場合に、より良い絶縁/回復オプションが得られることをお勧めします
git init --bare .
git remote add fetched $url --fetch
git for-each-ref --format='%(refname:short)' -- 'refs/remotes/fetched/' |
while read ref; do git branch -t "$(basename "$ref")" "$ref"; done
楽しんでください、HTH