火曜日, 3月 09, 2021

~/.gitconfig を ~/.config/git/config に移しました

今までは、git で管理している ~/.dotfiles/.config/git/.gitconfig に対して ~/.gitconfig からシムリンクを貼っていたのだが、こちらのページから git の設定ファイルは、~/.config/git/config に書けば良いことが分かった。

なので、~/.config/git/config を使うようにした。

また、attributes file も ~/.gitconfig に
[core]
  attributesfile = /Users/user/.dotfiles/git/.gitattributes
のようにファイルを指定して読み込むようにしていたのだけれども、こちらのリンクにあるように ~/.config/git/attributes に設定の内容を書き込むだけで良いことが分かったので、そのようにした。


これで、若干、ホームディレクトリがキレイになった!

火曜日, 2月 02, 2021

コミットログ(コミッター、コミッターのメールアドレス)を書き換える方法【改】

こちらの過去記事に従って、コミットログ(コミッター、コミッターのメールアドレス)を変えようとしたら以下のエラーが表示されたので、修正することにしました。

コミットログ(コミッター、コミッターのメールアドレス)を書き換える方法

表示されたエラーメッセージ

WARNING: git-filter-branch has a glut of gotchas generating mangled history
rewrites.  Hit Ctrl-C before proceeding to abort, then use an
alternative filtering tool such as 'git filter-repo'
(https://github.com/newren/git-filter-repo/) instead.  See the
filter-branch manual page for more details; to squelch this warning,
set FILTER_BRANCH_SQUELCH_WARNING=1.

なんでも git-filter-branch は不具合や実行速度が遅いので、今は Python で書かれた git-filter-repo を使うように勧められているようです。

こちらに git-filter-branch でのコマンドを git-filter-repo に書き換えるチートシートが用意されているのでこちらを見ながら、前回のブログ記事のコマンドを書き直すことにしました。

git-filter-repo/converting-from-filter-branch.md at main · newren/git-filter-repo

自分のやりたいことは間違ったメールアドレスを参照して間違ったメールアドレスのユーザー名、メールアドレスを変更することです。

従ってこちらのリンク先の git-filter-branch の例を git-filter-repo の例に書き換えます。

git-filter-repo/converting-from-filter-branch.md at main · newren/git-filter-repo - Changing author/committer(/tagger?) information

まずは git-filter-repo をインストールします。

インストール方法は、git-filter-repo のレポジトリに書いてありますが、パッケージツールを使ってインストールします。

サポートされているパッケージツールについては、git-filter-repo のレポジトリを参考にしてみて下さい。

git-filter-repo/INSTALL.md at main · newren/git-filter-repo

自分は、Mac の homebrew を使っているので、brew コマンドでインストールします。

$ brew install git-filter-repo

その後 .mailmap というファイル名でファイルを作り、間違ったメールアドレスと正しいユーザー名正しいメールアドレスを入力しておきます。

correct_name <correct_email@example.com> <wrong_email@example.com>

その状態で以下のコマンドを実行します。

$ git filter-repo --use-mailmap

こちらで上手くいくと思ったのですが、上手く変更されませんでした。

メールアドレスではなく、ユーザー名だと上手く行きました。

correct_name <correct_email@example.com> wrong_name

調べてみると git-filter-branch と似たような形式で変更できるコマンドが見つかりました。

How to change the author and committer name and e-mail of multiple commits in Git?

こちらを参考に変更してみます。

$ git filter-repo --commit-callback '

old_email = b"wrong@example.com"
correct_name = b"correct"
correct_email = b"correct@example.com"

if commit.committer_email == old_email :
  commit.committer_name = correct_name
  commit.committer_email = correct_email

if commit.author_email == old_email :
  commit.author_name = correct_name
  commit.author_email = correct_email
'

しかし、こちらでも上手く行かなかったので、email ではなく name を参照して変更することにしました。

$ git filter-repo --commit-callback '

old_name = b"wrong"
correct_name = b"correct"
correct_email = b"correct@example.com"

if commit.committer_name == old_name :
commit.committer_name = correct_name
commit.committer_email = correct_email

if commit.author_name == old_name :
commit.author_name = correct_name
commit.author_email = correct_email
'

すると、この方法では期待通りの結果を得ることが出来ました。

email では上手く変更が出来ず、name だと上手く変更が出来る理由は分かりませんでしたが、得たい結果が得られたのでヨシとします。

以上でおしまいです。

git-filter-branch を使うよりも .mailmap を使う場合はずっと簡単になります。

エラーメッセージも出ないし、精神的な負担も軽くすることができますね!

皆さんも試してみてください。

月曜日, 5月 20, 2019

gitconfig で会社用アカウントと個人用アカウントを分ける

タイトル通りです。基本、こちらの Qiita の記事を参考にしていますが、色々とハマりポイントがあったので、個人のメモとして残しておきます。

[git] gitconfigで会社用アカウントと個人用アカウントを楽に使い分けする - Qiita<

参考にした記事では、以下のファイル名ですが、自分なりに変更をしました。

変更前
  • ~/.gitconfig
  • ~/.gitconfig-work
  • ~/.gitconfig-other
変更後
  • ~/.gitconfig
  • ~/.gitconfig_work
  • ~/.gitconfig_personal

この辺は、自由に決めて良いと思います。

そして、オリジナルの ~/.gitconfig から [user] の箇所を削除して、~/.gitconfig_work, ~/.gitconfig_personal それぞれに [user] を追記します。

includeIfgitdir に含まれていないディレクトリ内で git レポジトリを作成してコミットすると、ローカルのユーザ名とマシン名(例: user1@iMac.lan)などでコミットされます。

デフォルトで name, email を設定しておきたい場合は、~/.gitconfig[user] の設定を残して置くのが良いと思います。

ここまで設定をして、いざ、コミット!!

としてみると、思ったようなユーザ名でコミットされません。。。

原因は、includeIfgitdir のディレクトリ名の最後に / を付けるのを忘れていたからでした。。。

こんなミスするの、自分だけなんだろうなぁ・・・。

(´・ω・`)

そして、更に設定をしてみましたが、どうやら指定したユーザ名になる時とならない時があります。

その原因は、階層の高いディレクトリ (~/dev/) を階層の低いディレクトリ (~/dev/project1/) の後に指定しているからでした。

includeIfgitdir は、最後にマッチした条件のファイルが適用されるので、階層の高いディレクトリから順々に指定する必要があります。

最終的なファイル内容は、以下の通りです。

~/.gitconfig
# config for personal
[includeIf "gitdir:~/dev/"]
  path = ~/.dotfiles/git/.gitconfig_personal

# overwrite specific projects
# config for work
[includeIf "gitdir:~/dev/project1/"]
  path = ~/.dotfiles/git/.gitconfig_work
~/.gitconfig_personal
[user]
  name = me
  email = me@personal.example.com
~/.gitconfig_work
[user]
  name = me
  email = me@work.example.com
将来の自分のために書き残しておきます。。。

次回は、こんなポカをしませんように。。。😅

土曜日, 2月 23, 2019

コミットログ(コミッター、コミッターのメールアドレス)を書き換える方法

2021年2月3日

現在は、git-filter-branch よりも git-filter-repo を使うことが推奨されています。

こちらの記事を参考にして git-filter-repo を使うようにしてみて下さい。

コミットログ(コミッター、コミッターのメールアドレス)を書き換える方法【改】



超久しぶりのブログ更新。

将来の自分のためにメモを残しておこうと思う。

ローカルで git 管理しているレポジトリを github に上げたら、レポジトリを作成したアカウントとは異なるアカウントでコミットしたことになっていた。

手順としては、user1 でレポジトリを作成して、その user1 のレポジトリにローカルのレポジトリを push したのに、何故か user2 のコミット履歴が表示された。

原因は、なんのことはない。ローカルのレポジトリには user2 でコミットしてた。。。😅

~/.gitconfig には以下のように設定されていたので、

[user]
  email = user2@example.com
  name = user2

ローカルのレポジトリのホームディレクトリにて、以下のコマンドを実行。

$ git config user.name "user1"
$ git config user.email "user1@example.com"

--global オプションをつけると ~/.gitconfig の設定が変更され、user.name、user.email の設定がされていないレポジトリは、すべて user1 のコミットになってしまう。つまり、グローバルに設定がされてしまう。😆

今回、github に push したレポジトリだけに限定したかったので、--global オプションは付けなかった。

これで、このコマンドを実行した移行のコミットについては、user1 のコミットとしてログに保存される。

しかし、これだと過去のコミットの user.name や user.email はそのままなので、それを修正する必要がある。

なので、こちらのページを参考に、修正をした。

How can I change the author (name / email) of a commit?

$ git filter-branch --env-filter '
WRONG_EMAIL="user2@example.com"
NEW_NAME="user1"
NEW_EMAIL="user1@example.com"

if [ "$GIT_COMMITTER_EMAIL" = "$WRONG_EMAIL" ]
then
    export GIT_COMMITTER_NAME="$NEW_NAME"
    export GIT_COMMITTER_EMAIL="$NEW_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$WRONG_EMAIL" ]
then
    export GIT_AUTHOR_NAME="$NEW_NAME"
    export GIT_AUTHOR_EMAIL="$NEW_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags

このコマンドを実行すると、過去のコミットすべてを書き換えるので、注意して実行する。

金曜日, 5月 09, 2014

Ubuntu 14.04 起動時に無線 LAN につながらない問題を /etc/pm/power.d/wireless の新規作成で解決しました

超久し振りにブログの更新。

最近、古い iMac (確か、2007年くらいに買って、購入時に入っていた OS は Leopard)に Ubuntu 14.04 を入れたのだが、起動時に無線 LAN につながらないという問題が発生していた。再起動をすることで、一応は無線 LAN につながるようにはなるのだけれども、使いたい時に毎回、起動、再起動をしないとインターネットにつながらないのはちょっと不便なので、修正をした。

結論としては、以下のリンクにある通りに実行するだけで、問題解決した!

networking - Cannot connect to wireless in Lubuntu 14.04 - Ask Ubuntu

やったこととしては、/etc/pm/power.d/wireless を新規作成して、以下の内容を記述しただけ。ファイルが存在していなかったので、新規作成をする必要があったけれども、それ以外は /etc/network/interfaces に必要な記述がされているかを確認するだけだった。

$ sudo vi /etc/pm/power.d/wireless
#!/bin/sh

/sbin/iwconfig wlan0 power off

これで、少しは時間の節約になるね。良かった!

火曜日, 7月 24, 2012

ターミナルでの処理が終わったらGrowlで知らせる方法

こちらに掲載されていた内容の横流し。

ターミナルでの処理が終わったらDockアイコンを跳ねさせ未読バッヂを表示、警告音も鳴らす方法 - Macの手書き説明書

"&& tput bel" をコマンドの後につけるだけ。"bell" ではなく "bel" なので注意。

$ ping -c 5 www.google.com && tput bel

とかすると、ping が終了した後に Growl でお知らせしてくれる。ターミナルがアクティブ状態になっていないことが条件のようだ。

因みに、エラー音も出る。エラー音の設定は、System Preferences の Sound で出来る。

自分はデフォルトの Funk を利用している。

地味に便利なので使ってみて!!

火曜日, 6月 19, 2012

emacs-w3m 実行時に Wrong type argument: arrayp, nil のエラー

突然ですが emacs-w3m をインストールすることにした。

まずは、いつものように環境から。

環境

  • Mac OS X Version 10.6.8
  • GNU Emacs 24.1.1 (x86_64-apple-darwin, NS apple-appkit-1038.36) of 2012-06-10 on bob.porkrind.org
  • emacs-w3m-1.4.4

インストール

こちらのページを参考にして、emacs-w3m をインストールした。

【参考】EmacsでWebページをみる。(Emacs-w3m) - redtower's memo
$ wget http://emacs-w3m.namazu.org/emacs-w3m-1.4.4.tar.gz
$ tar zxvf emacs-w3m-1.4.4.tar.gz
$ cvs -d :pserver:anonymous@cvs.namazu.org:/storage/cvsroot co emacs-w3m
$ cp -pr emacs-w3m/* emacs-w3m-1.4.4
$ cd emacs-w3m-1.4.4
$ ./configure --prefix=~/.emacs.d/elisp/emacs-w3m
$ make
$ make install

~/.emacs に以下の内容を記述。

(add-to-list 'load-path "~/.emacs.d/emacs-w3m/share/emacs/site-lisp/w3m")
(add-to-list 'Info-additional-directory-list "~/.emacs.d/elisp/emacs-w3m/share/info")
(require 'w3m-load)

エラーへの対応

M-x w3m として w3m を起動する。しかし、起動時に以下のエラーが表示され、起動に失敗する。

Wrong type argument: arrayp, nil

以下のページを参照すると、Emacs 22 未満でバイトコンパイルした *.elc を Emacs 23 でロードしているのが原因とのこと。

【参考】Re: (wrong-type-argument arrayp nil) in w3m-ems

「*.elc を直接開いてみると、先頭の方にバイトコンパイルした Emacs のバージョンが記載されている」とのことなので、インストールされた w3m.elc の先頭を確認してみると Emacs 22.1.1 でバイトコンパイルされていた。

「おかしい。。。自分の使っている Emacs は 24.1.1 だぞ。。。」と思い、コマンドプロンプトにて Emacs のバージョンを確認してみた。

$ which emacs
/usr/bin/emacs
$ emacs --version
GNU Emacs 22.1.1

ということで、Emacs 22.1.1 がバイトコンパイルに使われていることが判明した。これは、GUI で使っている Emacs と CUI で使っている Emacs が別のバージョンの Emacs であったことに原因がある。

  • CUI - /usr/bin/emacs
  • GUI - /Applications/Emacs.app/Contents/MacOS/Emacs

それぞれ CUI は 22.1.1、GUI は 24.1.1 であった。

よって、GUI の Emacs で w3m.el を開き、M-x byte-compile-file で w3m.el をバイトコンパイル。するとコンパイルエラー。先ほどのページのスレッドを辿ると「w3m-ems.el でエラーになる」とのことだったので、w3m-ems.el をコンパイルした後に、w3m.el をバイトコンパイル。

【参考】Re: (wrong-type-argument arrayp nil) in w3m-ems

すると今度は、バイトコンパイルに成功!!

そして、M-x w3m をするとエコーエリアに以下のエラー。

Searching for program: No such file or directory, /usr/bin/w3m

/usr/bin/w3m にシムリンクを貼る。

$ which w3m
/usr/local/bin/w3m
$ sudo ln -s /usr/local/bin/w3m /usr/bin/w3m

をして、M-x w3m をしたところ、無事に emacs-w3m を起動することが出来ました!!

しかし、よくよく先ほどのスレッドのページを見なおしてみると「EMACS を指定するようにして解決しました。」とのこと。以下のように make 実行時に EMACS を指定してインストールすると、無事に emacs-w3m をインストールすることが出来た。。。手動で w3m.el や w3m-ems.el をバイトコンパイルする必要なんてなかった。。。

$ ./configure --prefix=~/.emacs.d/elisp/emacs-w3m
$ make EMACS=/Applications/Emacs.app/Contents/MacOS/Emacs
$ make install

何はともあれ、emacs-w3m が動いて良かった!!これで次のステップに進めるょっ!!

(・∀・)