2023年5月30日火曜日

Gitで困った

しばらく前のこと、WindowsのCygwin上で
$ cd /cygdrive/c/git/
$ mkdir <リポジトリ名>.git
$ git init --bare --shared
で作ったGitのリポジトリをいろいろいじった後で、
主たる管理を別のGitサーバに任せようと
$ git clone --mirror /cygdrive/c/git/<リポジトリ名>.git
$ cd <リポジトリ名>.git
$ git push --mirror ssh://<Gitサーバ>/home/git/<リポジトリ名>.git
のようにコピーし、いざCygwin上で
$ git clone ssh://<Gitサーバ>/home/git/<リポジトリ名>.git
で取ってこようとすると
Cloning into '<リポジトリ名>'...
Enter passphrase for key '***************':
remote: Counting objects: ***, done.
remote: Compressing objects: 100% (***/***), done.
fetch-pack: unexpected disconnect while reading sideband packet
fatal: early EOF
fatal: fetch-pack: invalid index-pack output
とか言われてエラーとなりました。
で、ネットを頼りにcloneの前に
$ export GIT_TRACE_PACKET=1
$ export GIT_TRACE=1
$ export GIT_CURL_VERBOSE=1
$ git config --global http.postBuffer 157286400
$ git config --global http.postBuffer 524288000
$ git config --global core.compression 0
などとおまじないを唱えてみたもののダメ。
Cygwin上の"<リポジトリ名>.git"ディレクトリを
丸ごとGitサーバにコピーしてもダメ。
ところが、他のLinux PCからのCloneは問題なく成功。
なんじゃこりゃ!?

で、Cygwinのgitをバージョンを"2.39.0-1"から"2.38.1-1"に
落としたりいろいろやった挙句に気づいたのが、何度もcloneしてると時々成功し、
一度cloneに成功してしまえば後は特に問題がなさそうな事。
気持ちは悪いが、まあもういいやという感じで。

ところで今回調べていてリポジトリのコピー方法がいろいろあることを知りました。
$ git clone /cygdrive/c/git/<リポジトリ名>.git
$ cd <リポジトリ名>
$ git bundle create <生成するバンドルのファイル名> HEAD master
で作成したバンドルファイルを別のPCに持って行って空のリポジトリに対し
$ git clone <バンドルファイル> <リポジトリ名>
するのは、ネットワーク的に接続されていない複数拠点間で
リポジトリの修正差分を共有したりするのに応用できるようです。

またgitのremoteコマンドを使うと複数のリポジトリの同時参照も可能です。
例えばローカルのリポジトリをリモートのリポジトリにコピーするのは
$ git clone /cygdrive/c/git/<リポジトリ名>.git
$ cd <リポジトリ名>
$ git remote -v
$ git remote set-url origin ssh://<ユーザ名>@<gitサーバ>/home/git/<リポジトリ名>.git
$ git remote -v
$ git push
のような感じで可能です。
MicrosoftのクラウドサービスAzureのPaaSに
ウェブコンテンツをデプロイする際には
このテクニックを利用したりするみたいです。

それにしてもgitってすごい多機能で関心させられます。
Linus TorvaldsはこれをLinuxカーネルの開発のために
ちょちょいと作ったという話ですが、実装はともかく、
これらの仕様を丸っと最初から組み込んでいたのなら、
本当に先見の明があったのでしょうね。
まあ開発現場での問題点を愚直に解決していって
こうなっただけなのかもしれませんが。

0 件のコメント:

コメントを投稿