バージョン管理を使用したいのですが、セキュリティ上の理由により、作業中のサーバーにはインターネットアクセスがありません。USBフラッシュドライブ上のファイルのみを移動できます。このセットアップでGitを引き続き使用できますか?Gitリポジトリに適用できる小さなパッチを作成できますか?
server
どのネットワークにも接続されていないマシンを表す用語を使用するのは奇妙に思えます。インターネットにアクセスしなくても、ローカルネットワークでもかまいませんが、それでもネットワークのままです。
バージョン管理を使用したいのですが、セキュリティ上の理由により、作業中のサーバーにはインターネットアクセスがありません。USBフラッシュドライブ上のファイルのみを移動できます。このセットアップでGitを引き続き使用できますか?Gitリポジトリに適用できる小さなパッチを作成できますか?
server
どのネットワークにも接続されていないマシンを表す用語を使用するのは奇妙に思えます。インターネットにアクセスしなくても、ローカルネットワークでもかまいませんが、それでもネットワークのままです。
回答:
確かに、特定のプロトコルを必要とする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は標準のネットワークコンポーネント(ローカルディスクと通信するため)を使用するため、速度が低下します。
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アドレスを指定するだけです。
git init --bare <somepath.git>
指定されたサーバーで(SSHを介して)実行することにより、「リモート」リポジトリーを作成します。
コンピューター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:コミットの特定のリストを単一のファイルにアーカイブする「転送バンドル」を作成できます。
残念ながら、バンドルコマンドは前回最後にバンドルされたものを自動的に覚えていないため、手動でタグ付けまたはメモを保持する必要があります。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
同上。
manual tagging or note-keeping is needed
、レポは非常に大きい場合を除き1つのオプションですgit bundle create my.bundle --all
、それはすべてのものを含める必要があります
.git/
。リポジトリの推奨形式ですgit push
。
git bundle create
方法の1つは、外部ストレージを使用してリポジトリ間でデータを交換することで、git bundleです。この方法では、転送ごとに1つのファイルのみがあり、中間の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
バンドルが本来よりも大きくなります。
--all
すべてを取得するためにフラグに言及することを忘れないでください。レポジトリが十分に小さい場合は、毎回すべてを単純に転送するため、これが最も簡単なプロセスです!メモリスティックを緩めないでください-おそらく最大のセキュリティ問題!
最初に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リポジトリを開始できます。ここで説明されているように。