web-dev-qa-db-ja.com

ネットワークにアクセスせずに複数のシステムでGitを使用する

バージョン管理を使用したいのですが、セキュリティ上の理由から、作業中のサーバーにはインターネットアクセスがありません。ファイルを移動できるのはUSBフラッシュドライブだけです。このセットアップでGitを使用できますか? Gitリポジトリに適用できる小さなパッチを作成できますか?

83
Tutu Kaeen

確かに、Gitには特定のプロトコルを必要とするものは何もありません。箱から出してすぐ 標準クライアントは HTTP(S)、SSH、カスタムGitプロトコル、そしてをサポートします。ローカルプロトコル。これは、ローカルの.gitディレクトリへのパスを取得するだけです。このディレクトリは、作業ディレクトリ(/path/to/project/.git)またはベアディレクトリ(/path/to/project.git)内に置くことができますが、命名は単なる慣例です。

これは、もちろん、フラッシュドライブをリモートとして追加できることを意味します。

git remote add Origin /mnt/flashdrive/foo.git

または、Windowsの場合:

git remote add Origin F:\foo.git

あるいは別の名前の追加のリモートとして追加することもできます(どこかのインターネットサーバーを指すようにOriginを選択する場合)。

git remote add flashdrive /mnt/flashdrive/foo.git

それからあなたはちょうど他のものと同じようにこのリモコンに/からプッシュ/プルすることができます。

のドキュメント を読むと、動作が多少異なるfile://プロトコルもあります。 file://プロトコルを使用する場合、(ローカルディスクと通信するための)標準的なネットワークコンポーネントを使用するため、低速になるので、ローカルパスを使用することをお勧めします。

156
Bob

シングルコンピュータでは、特別なことは必要ありません。目的のディレクトリでgit initを実行し、通常どおりGitを操作します。

複数のコンピュータ間でリポジトリを同期するには、いくつかの方法があります。

方法1a(全くネットワークがありません):USBスティックに 'ベアリポジトリ'を作成し、それからそれにプッシュしてそこから引っ張ります他のリモートリポジトリでも同じです。つまり、ローカルパスを介したリポジトリ操作は、SSHまたはHTTPS URLを介した操作と何ら変わりはありません。

  1. 「リモート」リポジトリを作成します。

    $ git init --bare /mnt/Stick/Repositories/Large_Project.git
    
  2. コンピュータ1では、すべてをプッシュします。

    $ cd ~/Large_Project
    $ git remote add usb /mnt/Stick/Repositories/Large_Project.git
    $ git Push usb master
    
  3. コンピュータ2では、まあ、いつもと同じです。

    $ git remote add usb /mnt/Stick/Repositories/Large_Project.git
    $ git pull usb
    

(URLやパスから直接プッシュ/フェッチ/プルすることもできます。)

方法1b(内部ネットワーク):SSHが利用可能な内部サーバーがあり、それにGitがインストールされていれば、上記と同じ[user@]Host:pathまたはssh://[user@]Host/path構文を使用してSSHアドレスを指定します。

  1. 指定されたサーバー上で(SSH経由で)git init --bare <somepath.git>を実行して、「リモート」リポジトリを作成します。

  2. コンピュータ1では、前に示したのと同じ方法です。

    $ git remote add Origin myserver.example.com:Gits/Large_Project.git
    

    またはあなたが好めば:

    $ git remote add Origin ssh://myserver.example.com/Gits/Large_Project.git
    
  3. コンピュータ2においても、方法1aと同じである。


方法2:指定されたコミットのリストを単一のファイルにアーカイブする '転送バンドル'を作成できます。

残念なことに、bundleコマンドは前回最後に既にバンドルされたものを自動的に記憶しないため、手動のタグ付けまたはメモの保存が必要です。 git-bundleマニュアルから例を取ります。

  1. コンピュータ1で、ブランチ全体のバンドルを作成します。

    $ cd ~/Large_Project
    $ git bundle create /mnt/Stick/Project.bundle master
    $ git tag -f last-bundled master
    
  2. コンピュータ2では、バンドルからリポジトリであるかのようにバンドルを引き出します。

    $ cd ~/Large_Project
    $ git pull /mnt/Stick/Project.bundle
    

後続のバンドルはmaster全体をパックする必要はありません - それらは代わりにlast-bundled..masterから新しく追加されたコミットだけをパックすることができます。

  1. コンピュータ1で、新しく追加されたコミットのバンドルを作成します。

    $ cd ~/Large_Project
    $ git bundle create /mnt/Stick/Project.bundle last-bundled..master
    $ git tag -f last-bundled master
    
  2. 同上。

46
grawity

git bundle create

その方法の1つは、リポジトリ間でデータを交換するために外部記憶装置を使用することです git bundle 。このようにして、あなたはそれぞれの転送に対して一つのファイルだけを持ち、中間のGitリポジトリを持つことはできません。

それぞれの "git Push"はファイルの作成に変わり、 "git fetch"はそのファイルからものを取り出します。

デモセッション

最初のリポジトリを作成し、最初の "プッシュ"をする

gitbundletest$ mkdir repo1

gitbundletest$ cd repo1

repo1$ git init
Initialized empty Git repository in /tmp/gitbundletest/repo1/.git/
repo1$ echo 1 > 1 && git add 1 && git commit -m 1
[master (root-commit) c8b9ff9] 1
 1 file changed, 1 insertion(+)
 create mode 100644 1

repo1$ git bundle create /tmp/1.bundle master HEAD
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 384 bytes | 384.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)

第2のリポジトリ(すなわち第2のコンピュータ)への「クローニング」:

gitbundletest$ git clone /tmp/1.bundle repo2
Cloning into 'repo2'...
Receiving objects: 100% (3/3), done.

gitbundletest$ cd repo2/

repo2$ cat 1
1

いくつかの変更を行い、それらを別のバンドルファイルに「プッシュ」します。

repo2$ echo 2 > 1 && git add 1 && git commit -m 2
[master 250d387] 2
 1 file changed, 1 insertion(+), 1 deletion(-)

repo2$ git bundle create /tmp/2.bundle Origin/master..master Origin/HEAD..HEAD
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Writing objects: 100% (3/3), 415 bytes | 415.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)

最初のリポジトリに変更を「引っ張る」:

repo2$ cd ../repo1

repo1$ git pull /tmp/2.bundle 
Receiving objects: 100% (3/3), done.
From /tmp/2.bundle
 * branch            HEAD       -> FETCH_HEAD
Updating c8b9ff9..250d387
Fast-forward
 1 | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

repo1$ cat 1
2

最初のバンドルとは異なり、2番目のバンドルは部分的なGit履歴のみを含み、直接複製することはできません。

repo1$ cd ..

gitbundletest$ git clone /tmp/2.bundle repo3
Cloning into 'repo3'...
error: Repository lacks these prerequisite commits:
error: c8b9ff94942039469fa1937f6d38d85e0e39893a 
fatal: bad object 250d38747656401e15eca289a27024c61e63ed68
fatal: remote did not send all necessary objects

バンドルを使用することには、各バンドルに含めるコミットの範囲を手動で指定する必要があるという欠点があります。 git Pushとは異なり、git bundleは以前のバンドルの内容を追跡しません。手動でrefs/remotes/Origin/masterを調整する必要があります。そうしないと、バンドルが大きくなる可能性があります。

20
Vi.

最初に Git をインストールする必要があります。それから新しいリポジトリを作成するために、コピーしたフォルダ内で実行してください。

git init

その後、バージョン管理したいファイルをgit addで追加し(すべてのファイルに-aを追加)、変更のコミットを開始します(git commit)。

あなたはあなたの地元の歴史(git log)に取り組むことができるので、あなたはどんなリモートにもプッシュする必要はありません。

詳しくは、以下を確認してください。


インターネットなしでプッシュ/プル

git Pushコマンドを使用すると、SSH経由でプッシュすることができます(ローカル接続、イントラネットを使用)。

git remote add server ssh://[user@]Host.xz[:port]/path/to/dev/repo.git/
git Push server

またはフォルダにプッシュする:

git Push /mnt/usb/my_repo

これはあなたがあなたのリポジトリの2つのコピーを持っていると仮定します。

引っ張っても同じです。

git pull /mnt/usb/my_repo

パッチ適用

パッチを適用するには、patchコマンドまたはgit applyを使用できます。

参照: gitリポジトリからパッチまたは差分ファイルを作成し、それを別の異なるgitリポジトリに適用します

7
kenorb

ローカルでもGitを使うことができます。そうすると、コミットはローカルにしか保存されず、それを使ってバージョン管理することができます(そしてdiff/mergeなどができます)が、他のコンピュータからリポジトリにアクセスすることはできません。

ローカルフォルダでgit initを実行することで、ローカルのGitリポジトリを起動できます。 ここで説明しているように

5
dhae