gitでコミットした後に自動的にプッシュする方法は?


84

ローカルリポジトリにコミットするたびに、リモートリポジトリに自動的にプッシュするようにgitを設定するにはどうすればよいですか(パスフレーズの自動提供を含む)?


1
どのプロトコルをプッシュしていますか?パスワードの入力を求められた場合、これはSSHまたはHTTPのいずれかであると思います。
マークロングエア2011年

1
また、少なくとも使用しているオペレーティングシステムについて言及することは、gitの質問で常に役立ちます。
マークロングエア2011年

1
私はそのような設定の知恵に疑問を投げかけます。これにより、変更を別のコミットセットに再編成する機能が削除されます(特にリベース)。私はこのような設定で多くの間違いを犯しすぎて、結局私にとって有用ではありません。
jpmc26 2016

回答:


139

まず、パスワードを入力せずに手動でプッシュできることを確認してください。あなたはHTTPまたはHTTPS経由で推進している場合は、そのいずれかの場合になります作成.netrcログイン情報を使用してファイルをまたはリモートのためのURLにユーザー名とパスワードを追加します。SSHを使用している場合は、秘密鍵にパスワードがないキーペアを作成するか、秘密鍵のキャッシュに使用できssh-agentます

次に、以下を含む実行可能(chmod +x)ファイルを作成する必要.git/hooks/post-commitがあります。

#!/bin/sh
git push origin master

...以外のリモートにプッシュする場合origin、またはmaster。以外のブランチをプッシュする場合は、その行をカスタマイズします。そのファイルを実行可能にするようにしてください。


3
ssh-agentに私のパスフレーズを記憶させることができなかったので、それを空にする必要がありました。私の妻が私のアカウントをハッキングしないことを願っています:)
ulu 2011年

カスタマイズと言えば、この方法ですべてではなく一部のブランチをプッシュしたい場合はどうなりますか?たとえば.git/config、プレフィックスが付いた対応するリモートブランチを持つブランチのみを自動プッシュしたいとしますfeature/xy/
acumenus 2014

5
git push --all origin
矢田

4
chmod + x .git / hooks / post-commit
UnchartedWorks 2017年

33

マスターブランチ以外の使用を開始する場合は、現在のブランチを自動的にプッシュすることをお勧めします。私のフック(.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。ありがとう、私はあなたの解決策が一番好きです。
oyalhi 2016

コメントありがとうございます、@ oyalhi、私は答えのシバンラインを更新しました。今はもっとうまく移植できるはずです!
i4h 2016

こんにちは私はこのエラーを受け取ります:.git / hooks / post-commit:3行目:一致する「」を探しているときに予期しないEOF .git / hooks / post-commit:17行目:構文エラー:予期しないファイルの終わり
wwwwwwwwwwww

ねえ、確かに失われたバッククォートがありました。回答を更新しました。もう一度お試しください
i4h

9

.git / hooksディレクトリに「gitpush」という内容の「post-commit」という名前のファイルを作成します。ただし、パスワードを自動的に提供する場合は、変更が必要になります。


できればマーク・ロングエアの答えに賛成です。
コリンR

1
待って、何?コリンRは現在上位2%に入っています:)
ポストセルフ

3

このgit-autopushスクリプトを使用すると、「自動プッシュを構成する方法」で推奨されているものと同様に、コミット後のフックを設定できます。
ただし、パスフレーズの場合は、を実行するssh-agent必要があります。


の必要はありません。ssh-agent別のパスフレーズなしのgit-only - sshkey:を使用するだけです ssh-keygen -t ed25519 -f ~/.ssh/id_pushonlyecho $'\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
ティノ

@Tinoありがとうございます。なぜデジタル署名方式を使用しているのです-t ed25519か?私は一般的に使用し-t rsa、最近私が追加する必要があるが、-m PEMssh-keygenstackoverflow.com/a/53645530/6309stackoverflow.com/a/53729009/6309)。
VonC

@Tino rsaの速度が遅く、安全性が低いことは理解しています(長さが2048ビット未満の場合:bagja.net/blog/upgrade-ssh-key-to-ed25519.html)が、古いopensshサーバーを使用している可能性があります。 ed255519署名を正しく解釈しません。
VonC

ed25519短くて便利な行が表示されるため、主に使用し~/.ssh/authorized_keysます。また、DJBがed255519について書いていることも非常に興味深いです:サイドチャネル(スペクター)に対して安全で、CPUが少ないなど。ところで、古いものを扱うときsshd、私は通常それらのために特別なキーを作成し、これをで構成し~/.ssh/configます。
ティノ

0

LinuxとWindows(git bash)を使用している人のために、ssh上でパスフレーズを提供せずにプッシュ/プルするための簡単な手順を次に示します

クライアントの場合:

  1. 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. キーがない場合(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
    
  3. 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キーのコピー先のホームディレクトリは最初のログイン時に作成されます)


0

これは、gitがpushリモートリポジトリに自動的に送信するためのbashスクリプトです。

  1. ssh-agentを自動的にチェック
  2. 期待スクリプトを使用してパスフレーズを自動的に送信する
  3. 使用法は単純です:$ 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

0

ハスキーを使用している場合post-commit、デフォルトでフックファイルが上書きされます。

package.jsonでこのコマンドを使用して、マスターへのコミットを自動リベースしてプッシュします。(初回実行yarn add --dev git-branch-is。)

  "husky": {
    "hooks": {
     "post-commit": "git-branch-is master && git rebase origin master && git push origin master"`
    }
  }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.