【Git】Pushの際にユーザー名とパスワード入力を省略するツールを作ってみた

どうもハヤシです。

前回の記事では、Gitでリモートレポジトリにプッシュする際にコマンドラインから一括で実行できるツールの紹介をしました。

【Git】コマンドラインから一括でPushするツールを作ってみた

ただ、このツールだとプッシュの際にユーザー名とパスワードの入力をする必要があるんですよね。
折角だからこのユーザー名とパスワードの入力も省略してしまおう。
ということで、今回はPushの際にユーザー名とパスワード入力を省略するツールの紹介をしたいと思います。

ツール説明


本ツールは、以下のリンクから入手することが出来ます。
今回紹介するツールはリンク先の「git_omit.authentication.sh」という名前のシェルスクリプトです。

https://github.com/go12lim/UtilityTool

めんどくさい説明は要らないからさっさとツールを使いたいという人は、Readmeにも本ツールの使用方法が記載されてるのでそちらをご参考ください。

ツール概要

本ツールを実行し、設定ファイルを作成することで、以降のプッシュの際にユーザー名/パスワードの入力を省略することができます。
Gitでプッシュする際に毎回ユーザー名とパスワードを聞かれるのが煩わしい人向けです。

動作環境

動作環境はLINUXです。

使用方法

任意のディレクトリで本ツールを実行することで対話形式で設定ファイル(~/.netrc)を作成することができます。

※Gitのドメイン名の入力について
例)GitHub(https://github.com/)の場合、 github.comと入力してください。

解説

以上がツールの説明でした。
本章では、Gitの解説(そもそもツールで何をしてるんだ)とシェルスクリプトの解説を行います。

Gitの解説

まずは、Gitの解説から行きます。
このツールで何をしているのかというと結局は~/.netrcという設定ファイルを作成して以下のような記述をしているだけです。

machine gitのドメイン名
login gitのユーザー名
password gitのパスワード

~/.netrcという設定ファイルにgitのドメイン名、ユーザー名、パスワードを入力することでgitのプッシュの際に自動でユーザー名とパスワードを参照してくれます。
なので結論から言えば本ツールを使わずとも直接~/.netrcファイルを作成すればGitのプッシュの際のユーザー名とパスワード入力を省力することが出来ます。

シェルスクリプトの解説

続いて、シェルスクリプトの解説をします。


#!/bin/bash

FILE_PATH="$HOME/.netrc"

askYesNo(){
	while true; do
		read -p "$1 (y/n)>" input
		case $input in
		[yY] | [yY]es | YES ) return 0;;
		[nN] | [nN]o | NO) return 1;;
		*) echo "Please enter a valid value."
		esac
	done
}

writeFile(){

	read -p "Gitのドメイン名を入力してください:" domain
	echo "machine $domain" >> $FILE_PATH
	read -p "ユーザー名を入力してください:" user
	echo "login $user" >> $FILE_PATH
	read -p "パスワードを入力してください:" password
	echo "password $password" >> $FILE_PATH
}

if [ -e $FILE_PATH ]; then
	askYesNo "File exists. Do you want to overwrite it?"
	if [ $? -eq 0 ]; then
		>$FILE_PATH
		writeFile
	fi
else 
	touch $FILE_PATH
	writeFile
fi

1行目の#!/bin/bashはシェルスクリプトを書く際のおまじないです。
3行目では変数FILE_PATHを宣言しています。これは今回作成するファイルのパスです。
$HOMEはホームディレクトリを表します。
※ただし、FILE_PATHの宣言の際に、"~/.netrc"としないように注意してください。
~(tilde)$HOMEもホームディレクトリを表しますが、ダブルクォーテーションの中では~は展開されません。
詳しく知りたい方は、チルダ展開(tilde expansion)で調べてみてください。

5~14行目では、askYesNo()という関数を定義しています。
この関数は、ユーザーの入力がYesのとき0を返し、Noのとき1を返します。
案外説明が長くなるので今回は説明を割愛して別の記事で解説したいと思います。

16~24行目では、writeFile()という関数を定義しています。
readを用いることによってユーザーからのキー入力を読み込みます。
オプションに-pを指定することでコマンド上にメッセージを表示することが出来ます。
18行目では、ユーザーからのキー入力を変数domainに格納しています。

19行目では、リダイレクトを行っています。
シェルスクリプトでは通常キーボードから入力し、画面に出力しています。
>>を使うことによりこの出力先を変更することが出来ます。
たとえば、echo "hello" >> test.txtは、「hello」という文字をtest.txtに出力します。

26~35行目が、メインの処理になります。
メインの処理ではif文を用いて条件分岐を行っています。

シェルスクリプトでは、if文は

if [ 条件1 ]; then
処理1
fi

のように表します。

もし、条件1に当てはまらないときの記述もしたければ、

if [ 条件1 ]; then
処理1
else
処理2
fi

のように表します。

今回は、~/.netrcファイルの作成を行いたいので、if文で「~/.netrcファイル」がすでに存在しているか調べます。
ファイルが存在している場合は、上書きして良いか尋ねてファイルの上書き(あるいは何もしない)をします。
ファイルが存在していない場合は、ファイルの新規作成を行います。

if文でファイルが存在するか確認するには、if [ -e ファイル名 ]; thenのように記述します。
ファイルが存在するときにtrue, 存在しないときにfalseを返します。

touch ファイル名と記述することでファイルを作成することが出来ます。
29行目ではファイルの上書きを行っています。
これは、先述のリダイレクトを利用しています。
>>は追記を行うのに対して、>は上書きを行います。

ユーザーの許可なしにファイルの上書きをすると困りますよね。
ユーザーがファイルの上書きに同意した場合のみ上書きを行うのが良さそうです。
なので、ファイルの上書きを行う前に28行目でif文で条件分岐を行っています。
シェルスクリプトでは、$?という変数に直前に実行された関数の終了時ステータスが格納されています。
直前に実行された関数はaskYesNo()関数でこれはYesの場合(ファイルの上書きをしてよい場合)、0を返します。
なので、if [ $? -eq 0 ]; thenのようにif文を書きます。
-eqはイコールを表します。なので、$?(直前に実行された関数の終了時ステータス)が0のときtrueを返します。

注意点


パスワードを平文で保存することになるのでセキュリティ的に好ましくないです。
すでに別のシステムで.netrcファイルを利用している場合本ツールを使用することでファイルの内容が上書きされてしまいます。

【Git】コマンドラインから一括でPushするツールを作ってみた

どうも、ハヤシです。

GitでリモートレポジトリにPushする際に、毎回コマンドラインからgit addgit commitgit pushと3回コマンドを入力するのは面倒くさくないですか?

少なくともぼくは面倒くさいです。

というわけで、コマンドラインで実行することで、自動でローカルレポジトリの変更をコミットし、リモートレポジトリにプッシュしてくれるツールを作ったので公開します。

本ツールのみでは、プッシュの際にユーザー名とパスワードを入力する必要があります。
プッシュの際にユーザー名とパスワードの要求がされないようにするための方法については下記の記事で解説しています。

【Git】Pushの際にユーザー名とパスワード入力を省略するツールを作ってみた

ツール説明


本ツールは、以下のリンクから入手することが出来ます。
今回紹介するツールはリンク先の「git_automatic.sh」という名前のシェルスクリプトです。

https://github.com/go12lim/UtilityTool

めんどくさい説明は要らないからさっさとツールを使いたいという人は、Readmeにも本ツールの使用方法が記載されてるのでそちらをご参考ください。

ツール概要

このシェルスクリプトを実行することで自動でローカルレポジトリの変更をコミットし、リモートレポジトリにプッシュしてくれます。
git add, git commit, git pushと毎回3コマンドを打つのがめんどくさい人向けです。

動作環境

動作環境はLINUXです。

使用方法①

本ツールを当該プロジェクト直下(.gitが作成されている階層)に配置します。
ターミナルで当該プロジェクト直下に移動し、sh git_automatic.sh (引数1)と入力することでツールが実行されます。
例)

sh git_automatic.sh "commit message"

引数にコメントを入力することで任意のコミットメッセージを設定することができます。
引数にコメントを入力しない場合、デフォルトのメッセージがコミットメッセージとして設定されます。
デフォルトメッセージは、git_automatic.shの2行目にあるMESSAGE=${1:-"Default Message"}"Default Message"を直接書き換えることで変更されます。

使用方法②

本ツールを任意の位置に配置します。
環境変数が設定されているディレクトリにシンボリックリンクを生成します。
あるいは、シンボリックリンクを生成したディレクトリを環境変数に追加します。
環境変数は、echo $PATHで確認することができます。
シンボリックリンクは、ln -s (リンク元のファイルの絶対パス) (作成されるシンボリックリンクまでの絶対パス)で生成することができます。
例)

sudo ln -s $HOME/workspace/utility-tool/git_automatic.sh /usr/local/bin/gitauto

この際に、権限がないとエラーが生じた場合はlnの前にsudoを追加して再度実行してください。
当該プロジェクト直下で作成したシンボリックリンク名を入力することでツールが実行されます。
例)

gitauto "commit message"

それ以降は使い方①と共通です。

シェルスクリプトの解説


以上がツールの説明でした。
本章では、シェルスクリプトの解説をします。

#!/bin/bash
MESSAGE=${1:-"Default Message"}

git add -A
git commit -m "${MESSAGE}"
git push origin master 

1行目の#!/bin/bashはシェルスクリプトを書く際のおまじないみたいなもんです。
2行目では、変数MESSAGEを宣言しています。
シェルスクリプトでは、変数の宣言の際に他のプログラミング言語と同様に を使用します。
ただし、ほかの言語とは違い の前後にスペースをいれてはいけません。

$1は、シェルスクリプト実行時に指定した1番目の引数が設定される変数です。
同様に、2番目に指定した引数は$2に、n番目に指定した引数は$nに設定されます。
ちなみに、$0には、実行時のコマンド名が設定されます。
sh git_automatic.sh と実行した場合には「sh git_automatic.sh」が$0に設定されます。

${1:-"Default Message"}は、(1つ目の)引数が与えられている場合$1を返し、引数が与えられていない場合"Default Message"を返します。

したがって2行目では、引数が与えられている場合はその引数を変数MESSAGEに設定し、引数が与えられていない場合は「”Default Message”」を変数MESSAGEに設定するという処理を行っています。

4,5,6行目は普段コマンドラインに直接入力しているgit addgit commitgit pushのコマンドです。
git addのオプションには、-Aを指定しています。
これにより、新規作成・削除したファイルを含めgit管理内のすべての変更がステージングされます。
git commitのオプションには、-mを指定しています。
これによりコマンドラインからコメントを入力することが出来ます。
このオプションを省略した場合、対話形式でコメントを入力することになります。
また、コメントの内容には"${MESSAGE}"を指定しています。
${MESSAGE}とした場合だと変数MESSAGEに設定された文字列内に空白スペースがあった場合複数の引数として扱われてしまうためエラーが発生します。

注意点


本ツールでは、git addのオプションに-Aを指定しています。
したがって、本ツールを実行するとgit管理内のすべての変更がステージングされリモートレポジトリにプッシュされます。
そのためGitのもつバージョン管理といった本来の目的からはそれる使い方になっています。