10

git ベア リポジトリを定期的に同期しようとしています。ローカル ブランチは「--track」オプションを使用して作成されています。ここに私の設定があります(不要なものはありません):

[core]
        bare = true
[remote "origin"]
        url = git@github.com:Ummon/D-LAN.git
        fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
        remote = origin
        merge = refs/heads/master
[branch "website"]
        remote = origin
        merge = refs/heads/website

「cp」コマンドを使用してローカル ブランチを更新する必要があります。

 git fetch --all
 cp -r refs/remotes/origin/* refs/heads

よりエレガントなソリューションはありますか?

4

1 に答える 1

19

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

于 2011-04-05T23:02:46.173 に答える