Come eseguire automaticamente il push dopo aver eseguito il commit in git?


86

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?


1
Quale protocollo stai spingendo? Se richiede la password, presumo che sia SSH o HTTP.
Mark Longair

1
Inoltre, è sempre utile con le domande git menzionare almeno quale sistema operativo stai utilizzando.
Mark Longair

1
Metto in dubbio la saggezza di una tale configurazione. Ciò rimuove qualsiasi capacità di riorganizzare le modifiche in un diverso insieme di commit (ribasare, in particolare). Faccio troppi errori perché un allestimento come questo finisca per essermi utile.
jpmc26

Risposte:


141

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 .netrcfile 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-agentper memorizzare nella cache la tua chiave privata .

Quindi dovresti creare un file eseguibile ( chmod +x) .git/hooks/post-commitche contenga quanto segue:

#!/bin/sh
git push origin master

... personalizzando quella linea se si desidera eseguire il push a un telecomando diverso da origino eseguire il push di un ramo diverso da master. Assicurati di rendere eseguibile quel file.


3
Impossibile fare in modo che ssh-agent ricordi la mia passphrase, quindi ho dovuto renderla vuota. Spero che mia moglie non incidere il mio conto :)
Ulu

Parlando di personalizzazione, cosa succede se voglio spingere alcuni ma non tutti i rami in questo modo? Ad esempio, desidero eseguire il push automatico solo dei rami che hanno un ramo remoto corrispondente annotato .git/configcon il prefisso feature/xy/.
Acumenus

5
git push --all origin
Yada

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

33

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").


Per la prima riga, ho dovuto usare #!/bin/shper 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.
oyalhi

Grazie per il commento, @oyalhi, ho aggiornato la riga shebang nella risposta. Dovrebbe essere migliorato ora!
i4h

ciao ottengo questo errore: .git / hooks / post-commit: riga 3: EOF imprevisto durante la ricerca di corrispondenza `` '.git / hooks / post-commit: riga 17: errore di sintassi: fine del file inaspettata
Tobias

Ehi, in effetti c'era un backtick perso. Ho aggiornato la risposta, riprova
i4h

9

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.


Voterei la risposta di Mark Longair se potessi.
Colin R

1
Aspetta cosa? Colin R è ora tra i primi 2% :)
Post Self

3

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 .


Non v'è alcuna necessità di ssh-agent, basta usare un'altra frase segreta-meno git-solo sshtasto: ssh-keygen -t ed25519 -f ~/.ssh/id_pushonly. echo $'\nHost pushonly\nHostname DESTINATION\nIdentityFile ~/.ssh/id_pushonly\n' >> ~/.ssh/config. In DESTINATIONconfigurazione git-shellcome mostrato in superuser.com/a/444899/72223 utilizzando pubkey da ~/.ssh/id_pushonly.pub. L' gitURL necessario è qualcosa di simile git@pushonly:path/to/repo.git. Per eseguire il debug: ssh git@pushonly COMMANDdeve essere eseguitogit-shell -c COMMAND su DESTINATION. Per COMMANDvedereman git-shell
Tino

@Tino Grazie. Perché utilizzi lo schema della firma digitale -t ed25519? Uso generalmente -t rsa, anche se di recente devo aggiungere -m PEMa ssh-keygen( stackoverflow.com/a/53645530/6309 , stackoverflow.com/a/53729009/6309 ).
VonC

@Tino Capisco che rsa sia più lento, meno sicuro (se la sua lunghezza è inferiore a 2048 bit: bagja.net/blog/upgrade-ssh-key-to-ed25519.html ), ma ho a che fare con server openssh più vecchi che potrebbero non interpreta correttamente una firma ed255519.
VonC

Lo uso principalmente ed25519perché 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.
Tino

0

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:

  1. 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
    
  2. 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
    
  3. 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)


0

Ecco lo script bash per git per automaticamente pushin un repository remoto

  1. Controlla automaticamente ssh-agent
  2. Invia automaticamente la passphrase utilizzando lo script previsto
  3. L'utilizzo è semplicemente: $ cd /path/to/your/repositoryallora$ 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 /bindirectory in modo che possa essere chiamato con un semplice $ pushcomando

$ sudo ln -s $HOME/.ssh/push /bin/push
$ chmod +x /bin/push

0

Se stai usando Husky, sovrascriverà il tuo post-commitfile 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"`
    }
  }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.