web-dev-qa-db-ja.com

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

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

69
ulu

まず、パスワードを入力せずに手動でプッシュできることを確認します。 HTTPまたはHTTPSを介してプッシュする場合、 ログインの詳細を含む.netrcファイルを作成する または ユーザー名とパスワードをURLに追加する)リモート 。 SSHを使用している場合は、秘密鍵にパスワードがないキーペアを作成するか、 ssh-agentを使用して秘密鍵をキャッシュします のいずれかを作成できます。

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

#!/bin/sh
git Push Origin master

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

127
Mark Longair

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」)。

27
i4h

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

8
Colin R

この git-autopush スクリプトを使用すると、「 How how configure automatic push? 」で推奨されているように、コミット後のフックを設定できます。
しかし、パスフレーズの場合、 ssh-agentを実行 する必要があります。

3
VonC

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

クライアントで:

  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. キーがない場合(「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
    
  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
Rafał Gnitecki

Gitがリモートリポジトリに自動的にPushするbashスクリプトを次に示します。

  1. 自動チェック ssh-agent
  2. expect script を使用してパスフレーズを自動的に送信する
  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)
[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
0
Chetabahana