ローカルリポジトリにコミットするたびに、リモートリポジトリに自動的にプッシュするようにgitを設定するにはどうすればよいですか(パスフレーズの自動提供を含む)?
ローカルリポジトリにコミットするたびに、リモートリポジトリに自動的にプッシュするようにgitを設定するにはどうすればよいですか(パスフレーズの自動提供を含む)?
回答:
まず、パスワードを入力せずに手動でプッシュできることを確認してください。あなたはHTTPまたはHTTPS経由で推進している場合は、そのいずれかの場合になります作成.netrc
ログイン情報を使用してファイルをまたはリモートのためのURLにユーザー名とパスワードを追加します。SSHを使用している場合は、秘密鍵にパスワードがないキーペアを作成するか、秘密鍵のキャッシュに使用できssh-agent
ます。
次に、以下を含む実行可能(chmod +x
)ファイルを作成する必要.git/hooks/post-commit
があります。
#!/bin/sh
git push origin master
...以外のリモートにプッシュする場合origin
、またはmaster
。以外のブランチをプッシュする場合は、その行をカスタマイズします。そのファイルを実行可能にするようにしてください。
.git/config
、プレフィックスが付いた対応するリモートブランチを持つブランチのみを自動プッシュしたいとしますfeature/xy/
。
マスターブランチ以外の使用を開始する場合は、現在のブランチを自動的にプッシュすることをお勧めします。私のフック(.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」)で終わるブランチをプッシュしません。
#!/bin/sh
それを機能させるために使用する必要がありました。そうでなければ、それは言い続けました:error: cannot run .git/hooks/post-commit: No such file or directory
。ありがとう、私はあなたの解決策が一番好きです。
このgit-autopushスクリプトを使用すると、「自動プッシュを構成する方法」で推奨されているものと同様に、コミット後のフックを設定できます。
ただし、パスフレーズの場合は、を実行するssh-agent
必要があります。
ssh-agent
別のパスフレーズなしのgit
-only - ssh
key:を使用するだけです ssh-keygen -t ed25519 -f ~/.ssh/id_pushonly
。 echo $'\nHost pushonly\nHostname DESTINATION\nIdentityFile ~/.ssh/id_pushonly\n' >> ~/.ssh/config
。上DESTINATION
のconfiguregit-shell
に示すようにsuperuser.com/a/444899/72223からpubkeyでを使用~/.ssh/id_pushonly.pub
。必要なgit
-URLはのようなものですgit@pushonly:path/to/repo.git
。デバッグするには:でssh git@pushonly COMMAND
実行git-shell -c COMMAND
する必要がありますDESTINATION
。以下のためのCOMMAND
参照man git-shell
-t ed25519
か?私は一般的に使用し-t rsa
、最近私が追加する必要があるが、-m PEM
にssh-keygen
(stackoverflow.com/a/53645530/6309、stackoverflow.com/a/53729009/6309)。
ed25519
短くて便利な行が表示されるため、主に使用し~/.ssh/authorized_keys
ます。また、DJBがed255519について書いていることも非常に興味深いです:サイドチャネル(スペクター)に対して安全で、CPUが少ないなど。ところで、古いものを扱うときsshd
、私は通常それらのために特別なキーを作成し、これをで構成し~/.ssh/config
ます。
LinuxとWindows(git bash)を使用している人のために、ssh上でパスフレーズを提供せずにプッシュ/プルするための簡単な手順を次に示します
クライアントの場合:
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
キーがない場合(2つの「ls:cannot access ...」行)、新しいキーを生成します。キーのいずれかがある場合は、この手順をスキップしてください。
$ 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)
URL=git@github.com:${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