• このエントリーをはてなブックマークに追加

はじめに

Git を --prefix=$HOME/local な感じでインストールした環境のリモート先に push する際にエラーが出たので,その解決のためのメモ.

サンプル環境

リモートを iss.ms とでもしておきます:

% echo $HOME
/home/issm
% which git
/home/issm/local/bin/git

ローカル:

% pwd
/path/to/project
% git branch
* master
% git remote -v
origin issm@iss.ms:repos/foobar.git

git push 時のエラー

### ローカル
% git push origin master
zsh:1: command not found: git-receive-pack
fatal: The remote end hung up unexpectedly

git-receive-pack というコマンドが見つからないらしいです.

リモートで確認してみます:

### リモート
% which git-receive-pack
/home/issm/local/bin/git-receive-pack

push 時,リモート先に SSH で入って呼び出されるだろう git-receive-pack へのパスが通っていないことが原因のようですね.

git push コマンドには --receive-pack オプションがあり,これに実行したい git-receive-pack のパスを指定してやることで,先の問題を解決できるようです:

% git push --receive-pack=/home/issm/local/bin/git-receive-pack origin master
Counting objects: 67, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (15/15), done.
Writing objects: 100% (34/34), 3.14 KiB, done.
Total 34 (delta 23), reused 25 (delta 15)
To issm@iss.ms:repos/foobar.git
 + 0a1be9c...61d1365 master -> master

OK,push できました!

push のたびにオプションを指定するのはメンドイ

やってられません.

そういえば,.git/config の中身って,リモートごとに設定が書かれているよね,もしかしたら git config で何かできるんじゃね? と思い立って,tab補完しながらごにょごにょしてみた結果,remote.{remotename}.receivepack というプロパティに,先のパスをセットすることで解決できることがわかりました.(ドキュメントとかみてなくてスミマセン><)

### ローカル
% git config --list | grep remote.origin
remote.origin.url=git@git.meganedev.net:works/net-ps.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
%
% git config remote.origin.receivepack /home/issm/local/bin/git
% git config --list | grep remote.origin
remote.origin.url=issm@iss.ms:repos/foobar.git
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*
remote.origin.receivepack=/home/issm/local/bin/git-receive-pack
%
% git push origin master
# エラーなし!

git fetch のときも同様

git fetch するときは,リモートの git-upload-pack が呼ばれるので,remote.{remotename}.uploadpack というプロパティにそのパスをセットしておくとよいでしょう.

% git fetch origin
zsh:1: command not found: git-upload-pack
fatal: The remote end hung up unexpectedly
%
% git config remote.origin.uploadpack /home/issm/local/bin/git-upload-pack
%
% git fetch origin
# エラーなし!

おわりに

git config についてもっと知っておくべきですね!