カテゴリー
未分類

gitで直接アクセスできないリポジトリにプロキシを経由してアクセスする

gitでclone、push、pull をしようとしたとき、

以下のような問題が発生することがあります。

  • ネットワーク的にリモートリポジトリに到達できない
  • リモートリポジトリの対応しているプロトコルが、クライアントの対応しているプロトコルと合わない(sshのバージョンが違う、sslのバージョンが違う)

エラーの例

$ git clone ssh://xxx/xxx
Cloning into 'bs-ohkenhouse-system'…
no kex alg
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.

クライアント側がCentOS5など、環境が古すぎて、今どきのgitリポジトリにアクセスできないときは、プロキシを経由してアクセスさせることができます。

プロキシはSquidなどでどこかに立てるとよいでしょう。

gitクライアント側で、プロキシを経由するように設定するには、以下のようにします。

$git config --global http.proxy http://proxy.example.com:8080
$git config --global https.proxy http://proxy.example.com:8080

これによって、ホームディレクトリにある ~/.gitconfigに下記が追加されます。

[http]
proxy = http://proxy.example.com:8080
[https]
proxy = http://proxy.example.com:8080

カテゴリー
未分類

ssh://~ のgitリモートリポジトリに秘密鍵をしてして接続する

~/.ssh/config などの設定ファイルに頼らずに、コマンド実行の都度、リモートリポジトリを操作するときに使う鍵を指定する方法。

この方法は gitのバージョン2.3以降で使用できる。

$ git --version
git version 2.7.4

GIT_SSH_COMMANDという環境変数を指定することで、sshするときの秘密鍵を指定できるようになっている。

$ GIT_SSH_COMMAND='ssh -i 秘密鍵のパス' git コマンド

例)git clone

$ GIT_SSH_COMMAND='ssh -i ~/.ssh/id_rsa' git clone リモートリポジトリ

例)git pushの場合

$ GIT_SSH_COMMAND='ssh -i ~/.ssh/id_rsa' git push origin master

このように、自由に鍵が指定できる。

カテゴリー
未分類

gitのコミットが持っている情報

gitのコミットは以下の情報を持っている。

コミット =

  • 親コミットへのポインタ
  • 著作者・著作日時
  • コミッター・コミット日時
  • コミットメッセージ
  • コミット時点の内容へのポインタ(内容そのものは別のところにある)

どういう風に?というと、

git cat-file コマンドで実物を見ることができる。

e8e6d64eb083b3086e8ea45ec70e02915a514b68 というコミットがあるとすると、以下のように確認できる。

$ git cat-file -p e8e6d64eb083b3086e8ea45ec70e02915a514b68
tree 641652e56a0ac28f314d83c227e446f0394cef05
parent 1cc1a476468d8106ef2954f959dc7b747159a353
author xxxx著作者xxxx 1585804211 +0200
committer xxxxコミッターxxxx 1585804211 +0300

元になっているデータはどこにあるのかというと、

.git/objects ディレクトリの中を探すと、

(圧縮されていなければ)e8/e6d64eb083b3086e8ea45ec70e02915a514b68 というファイルがある。

圧縮されているので、コマンド経由で展開すると中身が見える。

tree 641652e56a0ac28f314d83c227e446f0394cef05
↑コミット時点のツリーへのポインタ

parent 1cc1a476468d8106ef2954f959dc7b747159a353
↑親コミットへのポインタ

なども、ファイルが存在して情報をたどっていくことができる。

カテゴリー
未分類

gitの仕組みの基本

gitの仕組みは、以下が基本。

「コミットは親コミットを持つ」

あるコミットを起点に、親をたどっていけるなら、

ちょうど家系図のように、履歴を追跡することができる。

それだけの仕組みで以下のようなログが出来上がる。

bootstrapのコミットログ

Subversionなどに慣れていると、コミットすれば数字の連番のリビジョンが振られて、コミット順にリビジョン順=時系列に並ぶイメージを持ってしまうが、

gitはコミットそれぞれが親子の関係でつながる仕組みになっている。