ローカルリポジトリにコミットするたびに、自動的にリモートリポジトリにプッシュするようにgitを設定するには(パスフレーズの自動提供を含む)。
まず、パスワードを入力せずに手動でプッシュできることを確認します。 HTTPまたはHTTPSを介してプッシュする場合、 ログインの詳細を含む.netrc
ファイルを作成する または ユーザー名とパスワードをURLに追加する)リモート 。 SSHを使用している場合は、秘密鍵にパスワードがないキーペアを作成するか、 ssh-agent
を使用して秘密鍵をキャッシュします のいずれかを作成できます。
次に、以下を含む実行可能ファイル(chmod +x
)を.git/hooks/post-commit
に作成する必要があります。
#!/bin/sh
git Push Origin master
... Origin
以外のリモートにプッシュする場合、またはmaster
以外のブランチをプッシュする場合、その行をカスタマイズします。そのファイルを実行可能にしてください。
Masterブランチ以上の使用を開始する場合、現在のブランチを自動的にプッシュすることができます。私のフック(.git/hooks/post-commit
)次のようになります。
#!/usr/bin/env bash
branch_name=$(git symbolic-ref --short HEAD`)
retcode=$?
non_Push_suffix="_local"
# Only Push if branch_name was found (my be empty if in detached head state)
if [ $retcode -eq 0 ] ; then
#Only Push if branch_name does not end with the non-Push suffix
if [[ $branch_name != *$non_Push_suffix ]] ; then
echo
echo "**** Pushing current branch $branch_name to Origin [i4h post-commit hook]"
echo
git Push Origin $branch_name;
fi
fi
Git symbolic-refでブランチ名を決定できる場合、現在のブランチをプッシュします。
" Gitで現在のブランチ名を取得する方法? "は、これと現在のブランチ名を取得する他の方法を扱います。
ソーセージ作成 が発生することが予想されるタスクブランチで作業する場合、すべてのブランチの自動プッシュは邪魔になる可能性があります(プッシュ後に簡単にリベースすることはできません)。そのため、フックは定義済みのサフィックスで終わるブランチをプッシュしません(例では「_local」)。
.git/hooksディレクトリに「post-commit」という名前のファイルを作成し、内容を「git Push」にします。ただし、パスワードを自動的に提供する場合は変更が必要になります。
この git-autopush スクリプトを使用すると、「 How how configure automatic push? 」で推奨されているように、コミット後のフックを設定できます。
しかし、パスフレーズの場合、 ssh-agent
を実行 する必要があります。
LinuxおよびWindowsを使用しているユーザーにssh経由でパスフレーズを提供せずにプッシュ/プルするための簡単な手順を次に示します(git bash)
クライアントで:
Sshキーが生成されているかどうかを確認します。
$ ls ~/.ssh/id_rsa.pub; ls ~/.ssh/id_dsa.pub
/c/Users/Cermo/.ssh/id_rsa.pub <-- I have RSA key
ls: cannot access '/c/Users/Cermo/.ssh/id_dsa.pub': No such file or directory
キーがない場合(「ls:cannot access ...」の2行)、新しいキーを生成します。いずれかのキーがある場合は、この手順をスキップしてください。
$ ssh-keygen.exe
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/Cermo/.ssh/id_rsa):
Enter passphrase (empty for no passphrase): <-- press Enter
Enter same passphrase again: <-- press Enter
Gitを使用してプルまたはプッシュするリモートサーバーにキーをコピーします。
$ ssh-copy-id user_name@server_name
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to
filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you
are prompted now it is to install the new keys
user_name@server_name's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'user_name@server_name'"
and check to make sure that only the key(s) you wanted were added.
注:この操作中にパスワードを入力する必要があります。その後、プル/プッシュ操作はパスワードを要求しません。
注2:この手順を使用する前に、user_nameを使用してサーバーに少なくとも1回ログインする必要があります(sshキーのコピー先のホームディレクトリは最初のログイン時に作成されます)
Gitがリモートリポジトリに自動的にPush
するbashスクリプトを次に示します。
$ cd /path/to/your/repository
その後$ Push
このスクリプトをたとえば$HOME/.ssh/Push
のファイルに配置します
#!/bin/bash
# Check connection
ssh-add -l &>/dev/null
[[ "$?" == 2 ]] && eval `ssh-agent` > /dev/null
# Check if git config is configured
if [ ! $(git config user.name) ]
then
git config --global user.name <user_name>
git config --global user.email <user_email>
fi
# Check if expect is installed
if [[ ! $(dpkg -l | grep expect) ]]
then
apt-get update > /dev/null
apt-get install --assume-yes --no-install-recommends apt-utils expect > /dev/null
fi
# Check identity
ssh-add -l &>/dev/null
[[ "$?" == 1 ]] && expect $HOME/.ssh/agent > /dev/null
# Clean and Push repo
REMOTE=$(git remote get-url Origin)
[email protected]:${REMOTE##*github.com/}
[[ $REMOTE == "http"* ]] && git remote set-url Origin $URL
git add . && git commit -m "test automatically Push to a remote repo"
git status && git Push Origin $(git rev-parse --abbrev-ref HEAD) --force
/bin
コマンドで呼び出すことができるように、$ Push
ディレクトリにリンクします
$ Sudo ln -s $HOME/.ssh/Push /bin/Push
$ chmod +x /bin/Push