로컬 리포지토리에 커밋 할 때마다 자동으로 원격 리포지토리로 푸시하도록 git을 설정하려면 (내 암호를 자동으로 제공하는 포함) 어떻게해야합니까?
로컬 리포지토리에 커밋 할 때마다 자동으로 원격 리포지토리로 푸시하도록 git을 설정하려면 (내 암호를 자동으로 제공하는 포함) 어떻게해야합니까?
답변:
먼저 비밀번호를 입력하지 않고 수동으로 푸시 할 수 있는지 확인합니다. HTTP 또는 HTTPS를 통해 푸시하는 경우 로그인 세부 정보 가 포함 된 .netrc
파일을 만들 거나 사용자 이름과 비밀번호를 원격 . 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
전용 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 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에 대해 쓴 내용 이 매우 흥미 롭습니다 . 사이드 채널 (Spectre), 적은 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
키가없는 경우 ( "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
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 키가 복사되는 홈 디렉터리가 생성됨).
다음은 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