web-dev-qa-db-ja.com

2つのgitリポジトリを同期する方法

異なるPCに2つのgitリポジトリがあります。私はそれらのすべてにいくつかのローカルブランチを持っています。このブランチをリモートサーバーに送信するのではなく、ローカルに保持します。 Webを使用せずに同期するにはどうすればよいですか? 1つのPCでリポジトリをZipして、別のPCに移動できますか?安全ですか?たぶんすべてのブランチから最新の変更を何とかエクスポートできますか?

35
szaman

ベアクローンを作成するよりも、bundleを作成することをお勧めします(「 git repository? ")、これはoneファイルを生成し、コピーしやすい(たとえばUSBスティック上)

ボーナスは、それがベアレポのいくつかの特徴を持っているということです:あなたはそれからプルするか、それをクローンすることができます。
しかし、心配する必要があるのは1つファイルだけです。

machineB$ git clone /home/me/tmp/file.bundle R2

これにより、結果のリポジトリで「Origin」というリモートが定義され、バンドルからフェッチおよびプルできるようになります。 $GIT_DIR/configR2ファイルには、次のようなエントリがあります。

[remote "Origin"]
    url = /home/me/tmp/file.bundle
    fetch = refs/heads/*:refs/remotes/Origin/*

結果のmine.gitリポジトリを更新するには、/home/me/tmp/file.bundleに保存されているバンドルを増分更新で置き換えた後、フェッチまたはプルすることができます。

元のリポジトリでさらに作業した後、増分バンドルを作成して、他のリポジトリを更新できます。

machineA$ cd R1
machineA$ git bundle create file.bundle lastR2bundle..master
machineA$ git tag -f lastR2bundle master

次に、バンドルを他のマシンに転送して/home/me/tmp/file.bundleを置き換え、そこからプルします。

machineB$ cd R2
machineB$ git pull
26
VonC

このブログの投稿「サーバーなしでGitリポジトリを同期する」 を参照してください(- Victor Costan による)。

この投稿では、リポジトリを持つ両方のホストへのネットワーク接続を持つサーバーを使用せずに、2つのリポジトリ間で変更をプッシュする方法について説明します

USBスティックにリポジトリを作成して起動します。

mkdir /path/to/usb/stick/repository.git
git clone --local --bare . /path/to/usb/stick/repository.git

次に、リポジトリをUSBスティックにリモートリポジトリとして登録し、目的のブランチをそこにプッシュします(マスターをプッシュしたくない場合は、目的のブランチに置き換えます)。

git remote add usb file:///path/to/usb/stick/repository.git
git Push usb master

将来的には、USBリポジトリを他のリモートリポジトリとして扱うことができます。マウントされていることを確認してください:)たとえば、次のコマンドはUSBリポジトリに新しい変更をプッシュします。

git Push usb

受信側でUSBスティックをマウントし、リポジトリのファイルURLを使用します

file:///path/to/usb/stick/repository.git

いくつかの便利なコマンド:

# cloning the repository on the USB stick
git clone file:///path/to/usb/stick/repository.git
# updating a repository cloned from the USB stick using the above command
git pull Origin
# adding the USB stick repository as a remote for an existing repository
git remote add usb file:///path/to/usb/stick/repository.git
# updating from a remote repository configured using the above command
git pull usb master
22
mpenkov

他のファイルシステムへのリポジトリの直接コピーは、ベアクローンまたはバンドルの代替手段です。コピーした後、最初のリポジトリにフェッチしてマージするために、コピーしたリポジトリをローカルリモートとして直接設定できます(ローカルリモートのように直感的でない場合があります)。

つまり2番目のコンピューターから〜/ repo1にrepo2をマージするには、最初に〜/ repo2のrepo1ファイルシステムにrepo2をコピーし(メモリースティック、ネットワークコピーなど)、次に回答を使用して Git pulling between 2つのローカルリポジトリ

~/repo1 $ git remote add repo2 ~/repo2
~/repo1 $ git fetch repo2
~/repo1 $ git merge repo2/foo

gitに関するWikipediaの記事 が言うように、これは機能します。「Gitリポジトリ—データとメタデータ—は、そのディレクトリ内に完全に含まれているため、通常のシステムレベルのコピー(または名前の変更、削除) Gitリポジトリ全体が安全な操作です。結果のコピーは元のコピーから独立していて、認識されていません。」

5
sage

少しひねりを加えたいです。他の投稿の情報は正しいようですが、私が実際に行っているいくつかの追加のことを述べたいと思います。

私が行った場合

git remote -v

このような情報を得る

USB_F   file:///f/Git_repositories/projectname.git (fetch)
USB_F   file:///f/Git_repositories/projectname.git (Push)
USB_G   file:///g/Git_repositories/projectname.git (fetch)
USB_G   file:///g/Git_repositories/projectname.git (Push)

基本的に、USBデバイスに割り当てられたドライブ文字は挿入先のポートに応じて変化するため、提案されたように、1つではなく複数のUSB名でリモートを定義しました。

次に、次のような内容のスクリプトを実行します

cd /path/to/projectname

if [ -d /f/Git_repositories/projectname.git ] 
then
    git Push USB_F --all
    git Push USB_F --tags
fi
if [ -d /g/Git_repositories/projectname.git ] 
then
    git Push USB_G --all
    git Push USB_G --tags
fi

意図は、USBリポジトリが存在する場合、それがどこにあっても、すべてのブランチとタグをUSBリポジトリにプッシュすることです。 (-dフラグはgitリポジトリディレクトリの存在をチェックし、ディレクトリが存在する場合にのみ条件付きコードが実行されます。)

元の質問は言った:私はいくつかのローカルブランチを持っていますそれらすべてに。このブランチをリモートサーバーに送信するのではなく、ローカルに保持します。 同期方法 ...

Push -allおよびPush --tagsコマンドはこの同期を実行し、すべてのブランチとタグがUSBリポジトリにプッシュされるようにします。知らなかった。マスターのデフォルト設定や、ブランチの名前を知ってそれらを1つずつ処理する必要はありません。

私はバックアップの目的でこれを実行するので、物事のプッシュ側のみを示し、プロジェクトとリポジトリの数を減らしました。実際には、複数のプロジェクトを複数の場所にバックアップしていますが、ここで関係があるのは繰り返しUSBアイテムだけです。

かなり明白ですが、私が言及したことを見たことがないもう1つのことは、PC AとPC Bを同期するために、

1. sync PC A and the USB device
2. sync PC B and the USB device
3. sync PC A and the USB device again!

または別の見方で、行く

PC A -> USB -> PC B
PC B -> USB -> PC A

最終的にブランチとタグは2台のマシンで同じになります。

0
Ivan