2011-02-01 34 views
32

私は異なるPCに2つのgitリポジトリを持っています。私はそれらのすべての地元支部を持っています。私はこのブランチをリモートサーバに送りたいだけで、ローカルにしておきます。 Webを使わずに同期するにはどうすればいいですか? 1台のPCでリポジトリを圧縮して別のPCに移動できますか?それは安全ですか?たぶん、私は何とか最新の変更をすべてのブランチからエクスポートできますか?2つのgitリポジトリの同期方法

+1

「サーバー」上のgitリポジトリとの唯一の違い(違いがある場合)は、サーバー上のレポがおそらく裸であるということです。他のPCは、サーバーとまったく同じように考えてください。 –

答えて

24

よりもむしろ裸のクローンを作ります私は、bundleHow can I email someone a git repository?を参照)を作成することを好んでおり、を生成します。ファイル、簡単にコピーすることができます(USBスティックなど)

裸のレポの特徴がいくつかあります:それを引き出したり、複製したりすることができます。
しかし、ファイルを心配する必要があります。

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

これは、あなたが取得し、バンドルから引くことができます結果のリポジトリに遠隔と呼ばれる「origin」を定義します。

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

は、結果のmine.gitリポジトリを更新するには、あなたがフェッチまたは増分更新で/home/me/tmp/file.bundleに格納されているバンドルを交換した後に引くことができます:R2$GIT_DIR/configファイルには、このようなエントリを持つことになります。

元のリポジトリにいくつかのより多くの作業が完了したら、他のリポジトリ更新する増分バンドルを作成することができます。

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 
+1

@Cacovsky:編集と固定リンクに感謝します。 – VonC

22

this blog post "Synchronizing Git repositories without a server "Victor Costan)を参照してください。

このポストは、USBスティック上のリポジトリを作成して起動両方のホスト有するリポジトリ

にネットワーク接続してサーバーを使用せずに2つのリポジトリ間の変更をプッシュするための方法を記載しています。その後

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スティックをマウントし、リポジトリ

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

いくつかの便利なコマンドのためにファイルのURLを使用します。

# 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 
+1

決して外部リンクに*完全に*依存しないでください:あなたはそれがどれくらい持続するか分かりません。 http://blog.stackoverflow.com/2009/06/stack-overflow-creative-commons-data-dump/で、その情報は永遠に利用可能になります。 – VonC

+0

ああ、ありがとう。私はテキストをきれいにする。 – misha

+0

最初に "git clone --local"を "git clone --no-hardlinks"として使用すると、詳細コピーである必要があることを明示的に明確にすることができますか? –

5

直接コピーは、代替クローンを裸にするか、バンドルすることです。コピーした後、コピーしたリポジトリをローカルリモートとして直接設定することができます - ローカルリモートが直感的でないほど直感的ではない - 最初のリポジトリにフェッチしてマージします。

I.e. 〜/ repo1に第二のコンピュータからrepo2をマージするために、〜/ repo2(メモリスティック、ネットワークのコピーなど)、その後、あなたがGit pulling changes between two local repositoriesへの回答に使用できるのrepo1ファイルシステムへの最初のコピーrepo2:

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

the wikipedia article on gitに「Gitリポジトリ - データとメタデータ - はそのディレクトリに完全に含まれているので、Gitリポジトリ全体の通常のシステムレベルのコピー(または名前変更や削除)は安全な操作です。コピーはオリジナルとは独立しており、オリジナルを意識していません。

+0

私はこれを確認する以上の知識を持つ人は誰ですか? @sage私はちょうど私の.gitを含んでいる私のディレクトリをUSBスティックにコピー貼り付けてバックアップしたいのであれば十分ではないでしょうか? –

+2

@nutty - 直接コピーは正確な状態でレポを転送するために正常に動作しますが、しばしばそれを行います。しかし、いくつかのユースケースでは、あるディスクの場所から別の場所にプル/マージできる方が望ましいと思います(たとえば、両方のレポの場所を編集して同期したい場合など)。 Gitはこの点で楽しく対応しています。 :-) – sage

0

私は物事にちょっとしたひねりを加えたいと思います。他の投稿の情報は正しいようですが、私が実際にやっているいくつかのことについて言及したいと思います。

私は

git remote -v 

をすれば、私は基本的に私はむしろちょうど1私のUSBデバイスに割り当てられたドライブ文字以降を示唆したものとはUSBの名前でいくつかのリモコンを定義している。この

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) 

のような情報を得ます私はそれを挿入するポートに応じて変更されます。私は、この

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リポジトリにすべてのブランチとすべてのタグをプッシュすることです。 (-dフラグはgitリポジトリディレクトリの存在をチェックしていて、ディレクトリが存在する場合のみ条件付きコードが実行されます)

元の質問:私はいくつかのローカルブランチを持っています。私はこのブランチをリモートサーバに送りたいだけで、ローカルにしておきます。 はどうすれば

プッシュ-all プッシュコマンドは、すべてのブランチやタグは、USBリポジトリにも、新しいものをプッシュしていることを確認し、この同期を行う--tags ...同期させることができますUSBリポジトリは認識しませんでした。枝の名前を知り、それを一つずつ扱う必要がある、あるいは習得する必要がない。

私はこれをバックアップ目的で実行していますので、私は物事のプッシュサイドを示し、プロジェクトとリポジトリの数を減らしました。実際には、私は複数のプロジェクトを複数の場所にバックアップしますが、ここで関連するUSB​​項目は繰り返ししかありません。

かなり明白ですが、私は言及見ていないというもう一つは、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台のマシンで同じになります。

関連する問題