git에서 커밋 한 후 자동으로 푸시하는 방법은 무엇입니까?


84

로컬 리포지토리에 커밋 할 때마다 자동으로 원격 리포지토리로 푸시하도록 git을 설정하려면 (내 암호를 자동으로 제공하는 포함) 어떻게해야합니까?


1
어떤 프로토콜을 추진하고 있습니까? 암호를 묻는 메시지가 나타나면 SSH 또는 HTTP라고 가정합니다.
Mark Longair 2011 년

1
또한 최소한 사용중인 운영 체제를 언급하는 것이 항상 git 질문에 도움이됩니다.
Mark Longair 2011 년

1
나는 그러한 설정의 지혜에 의문을 제기합니다. 이렇게하면 변경 사항을 다른 커밋 세트 (특히 리베이스)로 재구성하는 기능이 제거됩니다. 나는 이와 같은 설정에 대해 너무 많은 실수를 저에게 유용하게 만듭니다.
jpmc26

답변:


139

먼저 비밀번호를 입력하지 않고 수동으로 푸시 할 수 있는지 확인합니다. HTTP 또는 HTTPS를 통해 푸시하는 경우 로그인 세부 정보 가 포함 된 .netrc파일을 만들 거나 사용자 이름과 비밀번호를 원격 . SSH를 사용하는 경우 비공개 키에 비밀번호가없는 키 쌍을 만들거나을 사용 ssh-agent하여 비공개 키를 캐시 할 수 있습니다 .

그런 다음 다음을 포함 하는 실행 파일 ( chmod +x)을 만들어야합니다 .git/hooks/post-commit.

#!/bin/sh
git push origin master

... 이외의 원격지로 푸시 origin하거나 이외 의 분기 를 푸시하려는 경우 해당 라인을 사용자 정의합니다 master. 해당 파일을 실행 가능하게 만드십시오.


3
ssh-agent가 내 암호를 기억하도록 할 수 없어서 비워 두어야했습니다. 내 아내가 내 계정을 해킹하지 않기를 바랍니다. :)
ulu

커스터마이제이션과 관련하여 모든 분기가 아닌 일부만 이러한 방식으로 푸시하려면 어떻게해야합니까? 예를 들어 .git/config접두사로 표시된 해당 원격 분기가있는 분기 만 자동으로 밀어 넣고 싶습니다 feature/xy/.
Acumenus 2014

5
git push --all origin
Yada

4
chmod를 + X .git / 후크 / 후 커밋
UnchartedWorks

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

@oyalhi 댓글에 감사드립니다. 답변에서 shebang 라인을 업데이트했습니다. 이제 더 잘 이식되어야합니다!
i4h

안녕하세요,이 오류가 발생합니다 : .git / hooks / post-commit : 줄 3 :`` '일치를 찾는 동안 예기치 않은 EOF .git / hooks / post-commit : 줄 17 : 구문 오류 : 예기치 않은 파일 끝
wwwwwwwwwwww

헤이, 실제로 잃어버린 백틱이 있습니다. 답변을 업데이트했습니다. 다시 시도해주세요
i4h

9

.git / hooks 디렉토리에 "git push"라는 내용으로 "post-commit"이라는 이름의 파일을 만듭니다. 자동으로 암호를 제공하려면 수정이 필요합니다.


가능 하다면 Mark Longair의 답변을 찬성 하겠습니다.
Colin R

1
무엇을 기다립니다? Colin R은 현재 상위 2 %에
Post Self

3

git-autopush 스크립트를 사용하면 " 자동 푸시를 구성하는 방법 "에서 권장 된 것과 유사한 사후 커밋 후크를 설정할 수 있습니다 .
그러나 암호의 경우ssh-agent .


에 대한 필요가 없으며 ssh-agent다른 암호없이 git전용 ssh키를 사용하십시오 ssh-keygen -t ed25519 -f ~/.ssh/id_pushonly. echo $'\nHost pushonly\nHostname DESTINATION\nIdentityFile ~/.ssh/id_pushonly\n' >> ~/.ssh/config. 에 DESTINATION구성 git-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 COMMANDDESTINATION. 대한 COMMAND참조man git-shell
티노

@Tino 감사합니다. 디지털 서명 체계를 사용하는 이유는 무엇 -t ed25519입니까? 나는 일반적으로 사용 -t rsa최근에 내가 추가 할 필요가 있지만, -m PEMssh-keygen( stackoverflow.com/a/53645530/6309 , stackoverflow.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에 대해 쓴 내용 이 매우 흥미 롭습니다 . 사이드 채널 (Spectre), 적은 CPU 등에 대해 보안 sshd을 유지합니다 ~/.ssh/config.
Tino

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. 키가없는 경우 ( "ls : 액세스 할 수 없음 ..."줄 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을 사용하여 서버에 로그인해야합니다 (처음 로그인하는 동안 ssh 키가 복사되는 홈 디렉터리가 생성됨).


0

다음은 git push이 원격 저장소에 자동 으로 보내는 bash 스크립트입니다.

  1. ssh-agent 자동 확인
  2. expect 스크립트를 사용하여 자동으로 암호 보내기
  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

Husky를 사용하는 경우 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.