Come faccio a impostare git per il push automatico a un repository remoto (inclusa la fornitura automatica della mia passphrase) dopo ogni commit nel repository locale?
Come faccio a impostare git per il push automatico a un repository remoto (inclusa la fornitura automatica della mia passphrase) dopo ogni commit nel repository locale?
Risposte:
Innanzitutto, assicurati di poter eseguire il push manualmente senza fornire la password. Se esegui il push su HTTP o HTTPS, sarà il caso di creare un .netrc
file con i dettagli di accesso o di aggiungere il tuo nome utente e password nell'URL del telecomando . Se stai utilizzando SSH, puoi creare una coppia di chiavi in cui la chiave privata non ha una password o utilizzare ssh-agent
per memorizzare nella cache la tua chiave privata .
Quindi dovresti creare un file eseguibile ( chmod +x
) .git/hooks/post-commit
che contenga quanto segue:
#!/bin/sh
git push origin master
... personalizzando quella linea se si desidera eseguire il push a un telecomando diverso da origin
o eseguire il push di un ramo diverso da master
. Assicurati di rendere eseguibile quel file.
.git/config
con il prefisso feature/xy/
.
Se inizi a utilizzare più del ramo principale, potresti voler eseguire automaticamente il push del ramo corrente. Il mio hook ( .git/hooks/post-commit
) ha questo aspetto:
#!/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
Spinge il ramo corrente, se può determinare il nome del ramo con git symbolic-ref.
" Come ottenere il nome del ramo corrente in Git? " Si occupa di questo e di altri modi per ottenere il nome del ramo corrente.
Una spinta automatica per ogni ramo può essere fastidioso quando si lavora in rami di attività in cui ci si aspetta che avvenga un po 'di salsiccia (non sarà possibile ribasare facilmente dopo aver spinto). Quindi l'hook non spingerà i rami che terminano con un suffisso definito (nell'esempio "_local").
#!/bin/sh
per farlo funzionare. In caso contrario, continuava a dire: error: cannot run .git/hooks/post-commit: No such file or directory
. Grazie, mi piace di più la tua soluzione.
Crea un file chiamato "post-commit" nella directory .git / hooks con il contenuto "git push", anche se se vuoi fornire automaticamente una password, sarà necessaria la modifica.
Questo script git-autopush consente di impostare un hook post-commit, simile a quanto consigliato in " Come configurare il push automatico? ".
Ma per la passphrase, è necessario eseguire un filessh-agent
.
ssh-agent
, basta usare un'altra frase segreta-meno git
-solo ssh
tasto: ssh-keygen -t ed25519 -f ~/.ssh/id_pushonly
. echo $'\nHost pushonly\nHostname DESTINATION\nIdentityFile ~/.ssh/id_pushonly\n' >> ~/.ssh/config
. In DESTINATION
configurazione git-shell
come mostrato in superuser.com/a/444899/72223 utilizzando pubkey da ~/.ssh/id_pushonly.pub
. L' git
URL necessario è qualcosa di simile git@pushonly:path/to/repo.git
. Per eseguire il debug: ssh git@pushonly COMMAND
deve essere eseguitogit-shell -c COMMAND
su DESTINATION
. Per COMMAND
vedereman git-shell
-t ed25519
? Uso generalmente -t rsa
, anche se di recente devo aggiungere -m PEM
a ssh-keygen
( stackoverflow.com/a/53645530/6309 , stackoverflow.com/a/53729009/6309 ).
ed25519
perché fornisce linee brevi e pratiche per ~/.ssh/authorized_keys
. Inoltre è molto interessante quello che scrive DJB su ed255519 : Protezione contro canali laterali (Spectre), meno CPU, ecc. A proposito, quando si tratta di vecchi sshd
, di solito creo una chiave speciale per loro e poi lo configuro in ~/.ssh/config
.
Ecco semplici istruzioni per spingere / estrarre senza fornire la passphrase su ssh per le persone che utilizzano Linux e Windows (git bash)
Sul tuo cliente:
Controlla se hai le chiavi ssh generate:
$ 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
Se non hai alcuna chiave (due righe "ls: can't access ...") generane una nuova. Se hai uno dei tasti, salta questo passaggio.
$ 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
Copia la tua chiave sul server remoto da cui desideri eseguire il pull o il push utilizzando 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.
Nota: dovrai fornire la password durante questa operazione. Dopodiché le tue operazioni pull / push non richiederanno la password.
Nota 2: è necessario accedere al server utilizzando nome_utente almeno una volta prima di utilizzare questa procedura (la directory home in cui vengono copiate le chiavi ssh viene creata durante il primo accesso)
Ecco lo script bash per git per automaticamente push
in un repository remoto
$ cd /path/to/your/repository
allora$ push
Metti questo script in un file, ad esempio $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
Collegalo alla /bin
directory in modo che possa essere chiamato con un semplice $ push
comando
$ sudo ln -s $HOME/.ssh/push /bin/push
$ chmod +x /bin/push
Se stai usando Husky, sovrascriverà il tuo post-commit
file hook per impostazione predefinita.
Stiamo usando questo comando in package.json per auto-rebase-e-push qualsiasi commit al master. (Prima esecuzione yarn add --dev git-branch-is
.)
"husky": {
"hooks": {
"post-commit": "git-branch-is master && git rebase origin master && git push origin master"`
}
}