2017-12-02 9 views
1

私はネットワーク経由で接続されていない2つのリポジトリを同期させたいという問題に遭遇しています。私はgitバンドルを使用して2つのファイルを同期させましたが、コーナーケースを実行しました。git bundleを使ってairgapped reposを同期させる

私は経由でのgitバンドルを作成しています:<timestamp of lastBundle>lastBundleタグに関連するコミット時間から選ばれた

git bundle create --since=<timestamp of lastBundle> --all <my_bundle_path> 

。これにより、デルタだけをバンドルし、すべてのブランチですべての新しいコミットを取得することができます。この特定のシナリオが

master    2017-12-4 <dev who committed c2 finally gets around to pushing it to origin> 
|\ 
| \ 
| c3 <lastBundle> 2017-12-3 <commit that was synched> 
| | 
c2 |    2017-12-2 <commit from dev, timestamped to when s/he committed it to their local repo> 
\ | 
    \ | 
    c1    2017-12-1 <base commit> 

lastBundleが同期して発生し、airgappedレポのほとんど電流基準に対応し、誰かが自分の地元に早い時間でc3よりc2を犯したとき

コーナーケースがありますレポのコピーを作成し、原点への参照をすぐにプッシュしませんでした。したがって、次にlastBundle以降のすべてのコミットをバンドルしてドライブに入れ、それを他のマシンにロードすると、c2がマスターにマージするだけであるため、検証に失敗します。

私は共通の祖先を見つけることができるかどうかを確認するためにgit merge-baseを見て、その代わりに使用します。それは仕事をすることができますが、この状況は0,1、または複数のブランチで同時に発生する可能性があるため、ブランチごとにlastBundleタグが必要になると思います。それは最適ではないようです。

理想的には、リポジトリ全体ではなく、git履歴内の特定の場所に対してgit bundle verify <mybundle>を実行できるようにしたいと考えています。そうすれば、ディスクに置く前に失敗することを確認でき、バンドル時にコミットするまでの距離を変更するだけです。私が何をしようとしているか他の方法がない限り。

アイデア?

+0

問題が解決されたので、タグを保存する方法の詳細な解説を追加することができます。それと似たような質問をしている人にも役立ちます。 –

答えて

1

あなたは時間に基づいてではなく、あなたが実際に送信したものに基づいてバンドルを作成する必要があります。

git bundle create foo.bundle --branches 
git fetch foo.bundle 'refs/heads/*:refs/remotes/sent/*' 
.... 
git bundle create foo.bundle --branches --not --remotes sent 
git fetch... 
+0

お返事ありがとうございます!だから私はコマンドが '--remotes = sent'である必要があると思うが、それ以外には、実行する必要があることをしているようだ!他のものを明確にするために、最初にすべての参照をバンドルし、バンドルされた参照を指すrefspecを作成することが目的です。後で、 'sent' refspec以外のすべてをバンドルし、あなたのバンドルに対して再度フェッチすることによってあなたの" sent "を更新します。 – hobbitmessiah

+0

欠けているものが1つあります:これはタグを扱っていません。同期の間にもタグを保持できるようにしたいと思います。私が考えることができる唯一の方法は、 'git fetch foo.bundle 'refs/tags/*:refs/tags/sent/*''を実行し、そのバンドルを 'git bundle 'に変更することです。create foo.bundle --branches --tags --not --remotes = sent --tags = sent'です。これは、余分な参照の束を作成しますが、それは大丈夫です。また、強制的にタグを変更すると失敗しますが、それでもやり直すべきではありません。 – hobbitmessiah

関連する問題