2011-10-28 12 views
54

Come faccio a impostare git in modo che spinga automaticamente su un repository remoto (includendo automaticamente la mia passphrase) dopo ogni commit al repository locale?Come spingere automaticamente dopo aver eseguito il commit in git?

+1

Quale protocollo stai spingendo sopra? Se richiede la password, presumo che sia SSH o HTTP. –

+1

Inoltre, è sempre utile con le domande git per menzionare almeno quale sistema operativo si sta utilizzando. –

+0

Metto in discussione la saggezza di un tale set up. Ciò rimuove qualsiasi possibilità di riorganizzare le modifiche in un diverso gruppo di commit (in particolare, ribadendo). Faccio troppi errori perché un set come questo finisca per essere utile per me. – jpmc26

risposta

99

Innanzitutto, assicurarsi di poter eseguire il push manualmente senza fornire la password. Se si esegue il push su HTTP o HTTPS, si tratterà di creating a .netrc file with the login details o adding your username and password into the URL for the remote. Se stai usando SSH, puoi creare una coppia di chiavi in ​​cui la chiave privata non ha una password, oppure use ssh-agent to cache your private key.

Poi si dovrebbe creare un file in .git/hooks/post-commit che contiene quanto segue:

#!/bin/sh 
git push origin master 

... personalizzazione quella linea, se si vuole spingere ad un altro a distanza di origin, o spingere un ramo diverso master. Assicurati di rendere quel file eseguibile.

+2

Impossibile che ssh-agent ricordi la mia passphrase, quindi è stato necessario renderlo vuoto. Spero che mia moglie non possa hackerare il mio account :) – ulu

+0

Parlando di personalizzazione, cosa succede se voglio spingere alcuni ma non tutti i rami in questo modo? Ad esempio, voglio spingere automaticamente solo i rami che hanno un ramo remoto corrispondente annotato in '.git/config' con il prefisso' feature/xy/'. –

+2

git push --all origin – Yada

6

Creare un file denominato "post-commit" nella directory .git/hooks con il contenuto "git push", sebbene se si desidera fornire automaticamente una password, saranno necessarie modifiche.

+0

Eviterei Mark Longair's [answer] (http://stackoverflow.com/questions/7925850/how-to-automatically-push- after-committing-in-git/7925891 # 7925891) se potessi. –

+3

L'ho fatto per te. – ulu

+0

Aspetta, cosa? Colin R è ora nella top 2% :) – kim366

18

Se si inizia a utilizzare più del ramo master, è possibile che si desideri spingere automaticamente il ramo corrente. Il mio gancio si presenta così:

#!/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 = 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_mobiles post-commit hook]" 
     echo 
     git push origin $branch_name; 
    fi 
fi 

Spinge il ramo corrente, se si può stabilire il nome ramo con git simbolico-ref.

"How to get current branch name in Git?" tratta questo e altri modi per ottenere il nome del ramo corrente.

Una spinta automatica per ogni ramo può essere fastidiosa quando si lavora in rami di attività in cui si prevede che alcuni sausage making si verifichi (non sarà possibile rebase facilmente dopo aver premuto). Quindi il gancio non sposterà i rami che terminano con un suffisso definito (nell'esempio "_local").

+0

Per la prima riga, ho dovuto usare '#!/Bin/sh' per farlo funzionare. Altrimenti continuava a dire: 'errore: impossibile eseguire .git/hooks/post-commit: nessun file o directory simile». Grazie, mi piace la tua soluzione migliore. – oyalhi

+0

Grazie per il commento, @oyalhi, ho aggiornato la riga shebang nella risposta. Dovrebbe portare meglio ora! – i4h

0

Ecco semplice istruzione a spingere/tirare senza fornire passphrase tramite ssh per le persone che utilizzano Linux e Windows (git bash)

sul client:

  1. verificare se avete le chiavi SSH generato :

    $ 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 si dispone di un tasto qualsiasi (due "ls: non possono accedere ..." linee) generarne uno nuovo. Se hai qualcuno 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 chiave per server remoto da cui si vuole tirare o spingere con git:

    $ ssh-copy-id [email protected]_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 
    [email protected]_name's password: 
    
    Number of key(s) added: 1 
    
    Now try logging into the machine, with: "ssh '[email protected]_name'" 
    and check to make sure that only the key(s) you wanted were added. 
    

Nota: Sarà necessario fornire la password durante questa operazione. Dopo che le operazioni pull/push non richiederanno la password.

Nota 2: Devi effettuare il log al server utilizzando nome_utente almeno una volta prima di utilizzare questa procedura (home directory a cui le chiavi SSH vengono copiati è creato durante il primo login)

Problemi correlati