2015年7月6日月曜日

TortoiseGitのgit daemonでpull/fetchが成功しない

Chapter 2. TortoiseGit Daily Use Guide
https://tortoisegit.org/docs/tortoisegit/tgit-dug-daemon.html

Git protocol at port 9418 (git://hostname/).
ファイアーウォールで、 TCP Port 9418 への着信を許可する。

C:\Program Files (x86)\Git\bin>git.exe daemon --base-path=C:\Proj

C:\Proj\MyProj\.git\git-daemon-export-ok ファイルを作る--export-all 指定があれば、不要みたい。

TortoiseGitでCloneする場合、レポジトリはDir⇒Webにする。

---

Git daemonに対するGit cloneは、「当然失敗する」という前提に立って、まずはローカルでGit cloneを試みる。通常、何かエラーが出ます。

---

現象:
Cloning into 'C:\xxx'...
fatal: early EOF
remote: Counting objects: 186, done.
remote: Compressing objects: 100% (78/78), done.
fatal: read error: Invalid argument
fatal: index-pack failed


目下、有効な対策:
TCPRelayなどで、Git daemonの出力を一旦、バッファーに蓄積すれば、いけるようです。

対策①
git gc
git repack -a -f -d --window=250 --depth=250
参考
↑これがうまくいった、と思ったら、そうでもなかった。3回に1回成功する。

対策②
クライアント側で、
[core]
compression = -1
参考
↑解決しない。

対策③
チェックアウト画面で、Depth を 1 に。
↑解決しない。

対策④
メモリを増やす?

対策⑤
msysgit 1.8.3以下を使う。
参考

対策⑥
[core]
    packedGitLimit = 512m
    packedGitWindowSize = 512m
[pack]
    deltaCacheSize = 2047m
    packSizeLimit = 2047m
    windowMemory = 2047m
↑解決しない
参考

対策⑦
Wiresharkで通信を覗いて想像する。
Git daemonが、TCPのRSTをかましている事に気が付く。
ソースコードをチェックした所、外部コマンド upload-pack を実行していることに気が付く。
TCPRelayをかまして、「痛い切断」→「やさしい切断」にすることで、問題が出なくなった。解決。。。でもなかった。。。
どうも、upload-packは、60秒タイムアウト? みたいな物が有る。
さらに、大容量のデータ(11MB程)を一括で送ってくる模様。
つまり、11MBを60秒で受信できなければエラーのような感じです。
そこで、この11MBをTCPRelayで先に受信しておく。。。Git cloneで受信する方には、順次送っていく。この方法で解決。

git.exe daemon --base-path=C:\Proj --port=9417
TCPRelay.exe 0.0.0.0 9418 127.0.0.1 9417

TCPRelayを取得。(要.NET Framework 2.0)

0 件のコメント:

コメントを投稿