web-dev-qa-db-ja.com

開発の同期を保つためにgit-bundleを使用する方法は?

異なるコンピューターで開発ツリーを同期させ、それらの間にネットワーク接続がないようにする必要があります。

中央にgitリポジトリがあり、通常はオフィスのコンピューターで自分のクローンを作成しています。オフィスネットワークに接続されていない別のコンピューターで開発を行う必要がある場合があります。どのコンピューターもインターネットに接続されていません。開発は、同期間で両方のコンピューターで実行できます。

git-bundle のヘルプページを読んだことがありますが、これは最良のツールのように思えますが、どのように優れたワークフローを設定できるかはわかりません。

アドバイスやアドバイスをいただけますか?

66
matli

バンドル!

Gitバンドルを使用したワークフローは、他のワークフローと基本的に同じになります。これは非常に役立つアドバイスではないように思えるかもしれませんが、ここでは、通常使用するあらゆるワークフローを使用し、「プッシュ/プル」を「フラッシュドライブでここにバンドルを運んでからプル」に置き換えます。

マニュアルページには実際にこれを使用するためのかなり良いチュートリアルがありますが、これは一方向の例です。完全を期すために、情報を両方向に移動する方法を示す、少し変更したバージョンを以下に示します。

# on hostA, the initial home of the repo
hostA$ git bundle create hostA.bundle --branches --tags

# transfer the bundle to hostB, and continue:
hostB$ git clone /path/to/hostA.bundle my-repo
# you now have a clone, complete with remote branches and tags
# just to make it a little more obvious, rename the remote:
hostB$ git remote rename Origin hostA

# make some commits on hostB; time to transfer back to hostA
# use the known master branch of hostA as a basis
hostB$ git bundle create hostB.bundle ^hostA/master --branches --tags

# copy the bundle back over to hostA and continue:
hostA$ git remote add hostB /path/to/hostB.bundle
# fetch all the refs from the remote (creating remote branches like hostB/master)
hostA$ git fetch hostB
# pull from hostB's master, for example
hostA$ git pull

# make some commits on hostA; time to transfer to hostB
# again, use the known master branch as a basis
hostA$ git bundle create hostA.bundle ^hostB/master --branches --tags
# copy the bundle to hostB, **replacing** the original bundle
# update all the refs
hostB$ git fetch hostA

# and so on and so on

重要なことは、バンドルをリモートとして追加し、他のリモートと同じように操作できることです。そのリモートを更新するには、新しいバンドルをドロップインして、前のバンドルを置き換えます。

また、ベースを選択するために少し異なるアプローチを取りました。マニュアルページはタグを使用し、常に他のホストに転送された最後の参照で最新に保たれます。私は単にリモートブランチを使用しました。これは最後に転送された参照を参照しますfromもう一方のホスト。それは少し非効率的です。一歩遅れているため、必要以上にバンドルすることになります。しかし、フラッシュドライブは大きく、バンドルは小さく、余分な手順を踏んでタグに注意する代わりに、既に持っている参照を使用すると、多くの労力を節約できます。

バンドルを少し厄介なものにしていることの1つは、バンドルにプッシュできず、バンドルを「リベース」できないことです。新しいベースに基づいてバンドルが必要な場合は、再作成する必要があります。新しいコミットが必要な場合は、再作成する必要があります。この手間が私の次の提案を引き起こします...

サムドライブのレポ

正直なところ、レポが本当に大きい場合を除き、これは同じくらい簡単です。サムドライブにベアクローンを置くと、両方のコンピューターからプッシュおよびプルすることができます。ネットワーク接続のように扱ってください。中央レポに転送する必要がありますか?差し込みます!

110
Cascabel

@Jefromiの答えは素晴らしかった-git docsの10倍も優れていました。

まだ少し複雑ですので、ここで最も単純なケースを1回同期します(私の場合:FROM:壊れたwifiカードのあるオフラインラップトップ、TO:ネットアクセスのあるデスクトップ)。 @Jefromiの答えに基づいて、これはうまくいくようです:

AHEAD =いくつかのコミットが先にあるマシン。 BEHIND =コミットをコピーするマシン

1. AHEAD: git-bundle create myBundleName.bundle --branches --tags

両方:myBundleName.bundleをコピー(メール、USBなどを使用)

BEHIND:(myBundName.bundleファイルを任意の場所に配置します外部プロジェクトフォルダー)

2. BEHIND: cd [the project folder]
3. BEHIND: git pull [path to the bundle file]/myBundleName.bundle master

ブランチ名を最後に含める限り(デフォルトでは、ブランチを使用していない場合は「マスター」)、これは正常に機能しているようで、BEHINDの内部参照を置き換えません。 Originマスターとの間で同期できます。

つまり、BEHINDにインターネットアクセスがあれば、それでも安全です:

(OPTIONAL) 4. BEHIND: git Push

...そして、通常どおり、BEHINDでローカルに変更が行われたかのように、メインリポジトリを更新します。

9
Adam