2009-02-09 15 views
34

Dopo git clone, la configurazione nel nuovo pronti contro termine si presenta come:Come configurare git per evitare accidentali git push

remote.origin.url=<some url> 
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/* 
branch.master.remote=origin 
branch.master.merge=refs/heads/master 

Poi, posso eseguire "git pull" e "git push". Ma mi interessa solo fare "git pull", perché voglio spingere in un altro repo.

Una cosa che posso fare è:

git add remote repo-for-push <some other url> 
git push repo-for-push master 

Ma vorrei configurare git per utilizzare di default e distinti depositi per tirare e spingere, vale a dire:

git pull # pulls from origin 
git push # pushes into repo-for-push, avoiding accidental push into the origin 

Come può essere configurato ? Grazie in anticipo.

MODIFICA:
Fondamentalmente, voglio impostare il repository push di default in modo che sia diverso dal default repo/pull repo.

+0

in modo sostanzialmente si desidera impostare il il repository push predefinito è diverso dal default repo/pull repo, giusto? forse dovresti chiarirlo. – kch

+2

esatto, è lo stesso, ma con meno parole :) :) –

risposta

34

Sembra

git config remote.origin.receivepack /bin/false 

Rende spinta di origine remoto sicuro.

+0

Fantastico !!!! Questo è esattamente quello che stavo cercando. –

+0

Alcuni protocolli sono di sola lettura? Ciò farebbe fallire anche la spinta verso il repository sbagliato. –

+0

@Andrew: Giusto, se cloni tramite il protocollo git, sarai impostato. – Cascabel

7

Non sono sicuro di poterlo fare in git oggi. L'implementazione di git-fetch (in builtin-fetch.c) e git-push (in builtin-push.c) entrambi richiamano la funzione interna remote_get (NULL) per identificare il repository predefinito da pull-from/push-to.

Un'opzione sarebbe quella di creare un alias che specifica il repository desiderato. Per esempio:

git config --add alias.mypush "push repo-for-push" 

Poi si potrebbe:

git mypush 

a spingere al vostro repo desiderato. Non esattamente quello che vuoi, ovviamente. (Puoi anche considerare l'argomento --repo da spingere, vedi http://kerneltrap.org/mailarchive/git/2008/10/7/3537694 per un recente aggiornamento del documento che chiarisce l'argomento --repo.)

+0

Entrambi gli alias per "push repo-for-push" e per "push --repo repo-for-push" sono soluzioni valide. Grazie. –

+0

Come notato nella risposta di @Novelocrat, come da 1.6.4 questo non è più vero. –

0

Se potessi fare tutto il tuo push da un altro ramo, penso che potresti configurare quel ramo di avere un proprio repository separati per spingere a:

git checkout master 
git branch outbound 
git remote add destination <some url> 
git config branch.outbound.remote destination 

non ho provato questo, e potrebbe essere necessario fare un po 'più di lavoro per creare una soluzione completa. Potrebbe anche non funzionare per te, se devi spingere dal master.

+0

Con questa soluzione devo unire manualmente entrambi i rami ed essere consapevole del ramo corrente di git push xor git pull correttamente. Non meglio degli alias, se non sono in grado di configurare git per evitare/annullare/vietare un lancio di git o push quando il ramo corrente non è quello giusto. Grazie! –

+0

Come indicato nella risposta di @Novelocrat, questo non è più necessario. –

0

Completa il comando "git" in qualcosa che mangia l'argomento push. Fuori della parte superiore della mia testa ho scritto questo:

 
~$ cat /usr/local/bin/git 
#!/bin/bash 

# git wrapper 
# prevents pushing to repository 

declare -a args 
declare msg='' 
while [ $# -gt 0 ] 
do 
    if [ "$1" != 'push' ]; then 
     args=("${args[@]}" "$1") 
    else 
     msg="No pushing" 
    fi 
    shift 
done 

if [ ${#msg} -gt 0 ]; then 
    echo "$msg" 
fi 
/usr/bin/git "${args[@]}" 

Basta essere sicuri di avere il comando avvolto nel tuo percorso prima del comando git "reale".

+0

Buona idea, ma dovrebbe essere nel filesystem dell'utente e dovrebbe controllare la directory di lavoro corrente quando ci sono alcuni repository senza questa restrizione. Grazie. –

27

Nella versione 1.6.4, Git ha ottenuto la possibilità di ottenere un pull remoto da un URL e passare a un altro utilizzando l'impostazione di configurazione remote.name.pushurl. Posso immaginare un comportamento strano se il repository push non tiene traccia del pull-repository, ma ho il sospetto che Git proverà a far avanzare rapidamente il repository-push dal/dai branch corrente/tracking/matching senza riguardo per quello che tirerà quando chiede al telecomando lo stesso nome.

Per esempio, se si voleva tirare via il protocollo git anonima, ma spingere via SSH (forse avete bisogno di un valore di fuori di un token SecurID o qualcosa per l'autenticazione):

[remote "myremote"] 
    url = git://server/path 
    pushurl = [email protected]:/path