バージョン管理を使用したいのですが、セキュリティ上の理由から、作業中のサーバーにはインターネットアクセスがありません。ファイルを移動できるのはUSBフラッシュドライブだけです。このセットアップでGitを使用できますか? Gitリポジトリに適用できる小さなパッチを作成できますか?
確かに、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://
プロトコルを使用する場合、(ローカルディスクと通信するための)標準的なネットワークコンポーネントを使用するため、低速になるので、ローカルパスを使用することをお勧めします。
シングルコンピュータでは、特別なことは必要ありません。目的のディレクトリでgit init
を実行し、通常どおりGitを操作します。
複数のコンピュータ間でリポジトリを同期するには、いくつかの方法があります。
方法1a(全くネットワークがありません):USBスティックに 'ベアリポジトリ'を作成し、それからそれにプッシュしてそこから引っ張ります他のリモートリポジトリでも同じです。つまり、ローカルパスを介したリポジトリ操作は、SSHまたはHTTPS URLを介した操作と何ら変わりはありません。
「リモート」リポジトリを作成します。
$ git init --bare /mnt/Stick/Repositories/Large_Project.git
コンピュータ1では、すべてをプッシュします。
$ cd ~/Large_Project
$ git remote add usb /mnt/Stick/Repositories/Large_Project.git
$ git Push usb master
コンピュータ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アドレスを指定します。
指定されたサーバー上で(SSH経由で)git init --bare <somepath.git>
を実行して、「リモート」リポジトリを作成します。
コンピュータ1では、前に示したのと同じ方法です。
$ git remote add Origin myserver.example.com:Gits/Large_Project.git
またはあなたが好めば:
$ git remote add Origin ssh://myserver.example.com/Gits/Large_Project.git
コンピュータ2においても、方法1aと同じである。
方法2:指定されたコミットのリストを単一のファイルにアーカイブする '転送バンドル'を作成できます。
残念なことに、bundleコマンドは前回最後に既にバンドルされたものを自動的に記憶しないため、手動のタグ付けまたはメモの保存が必要です。 git-bundleマニュアルから例を取ります。
コンピュータ1で、ブランチ全体のバンドルを作成します。
$ cd ~/Large_Project
$ git bundle create /mnt/Stick/Project.bundle master
$ git tag -f last-bundled master
コンピュータ2では、バンドルからリポジトリであるかのようにバンドルを引き出します。
$ cd ~/Large_Project
$ git pull /mnt/Stick/Project.bundle
後続のバンドルはmaster
全体をパックする必要はありません - それらは代わりにlast-bundled..master
から新しく追加されたコミットだけをパックすることができます。
コンピュータ1で、新しく追加されたコミットのバンドルを作成します。
$ cd ~/Large_Project
$ git bundle create /mnt/Stick/Project.bundle last-bundled..master
$ git tag -f last-bundled master
同上。
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
を調整する必要があります。そうしないと、バンドルが大きくなる可能性があります。
最初に 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を使うことができます。そうすると、コミットはローカルにしか保存されず、それを使ってバージョン管理することができます(そしてdiff/mergeなどができます)が、他のコンピュータからリポジトリにアクセスすることはできません。
ローカルフォルダでgit init
を実行することで、ローカルのGitリポジトリを起動できます。 ここで説明しているように 。