タグ: Git

.gitconfigはGitで管理しておいて、git config user.name/user.emailは管理したくない

Gitを使う上で、git config user.name/user.emailの設定は必要。そして.gitconfigなどのdotfilesをgithubで管理したいけど、git config user.name/user.emailはそこに記載したくない。
ということで、gitconfigのincludeを使って別ファイルにしました。

Gitで管理する.gitconfigには

[include]
  path = ~/.gitconfig.local

としておいて、dotfileの展開スクリプト内で

GIT_CONFIG_LOCAL=~/.gitconfig.local
if [ ! -e $GIT_CONFIG_LOCAL ]; then
  echo -n "git config user.email?> "
  read GIT_AUTHOR_EMAIL

  echo -n "git config user.name?> "
  read GIT_AUTHOR_NAME

  cat < $GIT_CONFIG_LOCAL
[user]
  name = $GIT_AUTHOR_NAME
  email = $GIT_AUTHOR_EMAIL
EOF
fi

とすることで、展開スクリプト実行中にプロンプトを出して、user.name/user.emailを入力させました。

実際のdotfileの展開スクリプト

参考

広告

gitのhookをスキップ

コミットする際に、コードのチェックや整形を行うスクリプトをpre-commitフックに入れていました。
あるとき複数の変更が入ったコードを内容ごとに分けてコミットするために、 git add -pでコードの一部分をステージ上げ、コミットしようとしたところ、フックスクリプトによって、
一部分ではなく、変更のあった部分がすべてコミットされてしまうことがありました。

フックスクリプトをgit add -pに対応する修正調べてみましたが、やり方がわからなかったので、
コードのチェック済みという前提で、フックをスキップできる方法を調べたところ、

より、–no-verify (-n) オプションで、pre-commitとcommit-msgフックをスキップできるとのこと。

git commit --no-verify

または

git commit -n

gitのtagをリモートに反映する

[git] gitのtagをリモートに反映する | blog mg ☃ frozen
git でリモートのタグやブランチを削除する方法 – Qiita

1.タグの追加をリモートに反映

ローカルでタグ付け

git tag TAGNAME

リモートに反映。リモート名はoriginの場合、

git push origin TAGNAME

2.タグの削除をリモートに反映

ローカルでタグを削除

git tag -d TAGNAME

リモートに反映。リモート名はoriginの場合、

git push origin :TAGNAME

1.7以降であれば

git push --delete origin TAGNAME

3.リモートタグの一覧

git ls-remote --tags origin

GitLabで作成したリポジトリに対して、ポート22以外のSSH経由でアクセスできるようにする

セキュリティなどの理由からSSHをポート22以外で動かしているサーバにGitLabをインストールした際、
クライアントからそのGitLabで作成したリポジトリ(git@SERVERNAME:USERNAME/REPOSITORY.git)に対してアクセスできるようにする。

確認事項

  • サーバで稼働しているSSHは22以外で動いている(今回は10022)
  • GitLabはユーザgitで動いている(=リポジトリのユーザ名部分がgit)
  • GitLabに登録したSSHの鍵を使ってgit@SERVERNAMEにポート10022に対してSSHで接続できる
    ※接続すると
    Welcome to GitLab, USERNAME
    Connection to SERVERNAME closed.
    と表示されて切断される
    

方法1 クライアント側のSSHの設定ファイルを編集する

vi ~/.ssh/config

  Host SERVERNAME
  Port 10022
  IdentityFile 秘密鍵のパス

アクセスするリポジトリURLはそのまま

git@SERVERNAME:USERNAME/REPOSITORY.git

方法2 GitLabの設定ファイルを編集しSSHのポート番号を指定する

vi config/gitlab.yml

  ssh_port: 10022

その後、GitLabを再起動

GitLabのプロジェクトページにアクセスすると、リポジトリURLが

ssh://git@SERVERNAME:10022/USERNAME/REPOSITORY.git

と変わっているので、そこに対してアクセスする

参考

git credential helperを使ってHTTP越しで認証がかかっているリポジトリにアクセスする

HTTP越しでリポジトリにアクセスする際、認証がかかっていると、毎回ユーザ名とパスワードを入力する必要がある。

Basic認証がかかっているリポジトリにgit・hgでアクセスする際、ユーザ名とパスワードを保存する方法 | misty-magic.h

のように.netrcを使うことで入力の手間を省くことができるが、Git 1.7.9以降であれば、credential helperを使うことで同様のことができる。

git credentialコマンドの存在確認

$ git help -a|grep credential-

credential-cache
credential-cache--daemon
credential-store

git-credential-storeとgit-credential-cacheがあるのが確認できる。
credential-cache–daemonはgit-credential-cacheで利用される。

git-credential-store

git-credential-store(1)

認証情報を平文で保存する。

使い方

git-credential-storeを利用するように設定する。

git config --global credential.helper store

クローンしてみる。初回は、ユーザ名(ここではuserhoge)とパスワードを聞かれる

$ git clone https://example.jp/repos/git/sample.git
Cloning into 'sample'...
Username for 'https://example.jp': userhoge
Password for 'https://userhoge@example.jp': *******

いったんクローンしたリポジトリを削除して、再度クローンすると次は、認証情報を聞かれずにクローンできる。

cloneが終わると、$HOME/.git-credentialsというファイルが生成される。
中身はリポジトリホスト名とユーザ名・パスワードが平文で保存されている。

$ cat ~/.git-credentials

https://userhoge:********@example.jp

git-credential-cache

git-credential-cache(1)

認証情報をメモリ上に一定時間保存する

使い方

git-credential-cacheを利用するように設定する。

git config --global credential.helper cache

デフォルトでは900秒の間、認証情報をキャッシュしている。
キャッシュ時間はオプションで変更できる。

git config credential.helper 'cache --timeout=300'

クローンしてみる。同じく初回はユーザ名・パスワードを聞かれるが、キャッシュが有効の間は再度認証情報を聞かれない。

$HOME/.git-credential-cacheディレクトリが生成され、credential-cache–daemonと通信するsocketが生成される。

gitを1.8にアップデートした結果、HTTP越しでアクセスできなくなった時の対処法

RedmineとSubversion・Git・Mercurialのリポジトリ(ともに同じCentOSサーバ上)の連携(リポジトリの作成とアクセス・認証)

で設定したgitリポジトリにpushした際、

fatal: https://example.jp/repos/git/sample.git/info/refs not found: did you run git update-server-info on the server?

となり、pushできなくなりました。

cloneをしてみると、

Cloning into 'sample'...
fatal: repository 'https://example.jp/repos/git/sample.git/' not found

となり、ブラウザでアクセスしても404 Not Foundという状態に。

調べてみると、apacheのエラーログには

script not found or unable to stat: /usr/libexec/git-core

とあり、
apacheの設定で、

ScriptAlias /repos/git/ /usr/libexec/git-core/git-http-backend/

とある箇所の、/usr/libexec/git-core/git-http-backendが
git 1.8にアップデートした結果なくなった模様。

git-http-backend自体は/usr/binに存在していたので、

ScriptAlias /repos/git/ /usr/bin/git-http-backend/

にしたところ、問題なく動くようになりました。

※git 1.7はrpmforgeリポジトリのものでしたがgit 1.8はepelリポジトリのものを使っていました。