2009-02-09 23 views
34

Después de git clone, la configuración de la nueva operación se parece a:Cómo configurar Git para evitar accidental 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 

Entonces, puedo ejecutar "git pull" y "git push". Pero me interesa solo hacer "git pull", porque quiero ingresar a otro repositorio.

Una cosa que puedo hacer es:

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

Pero me gustaría configurar Git para usar repositorios por defecto y distintas de tracción y presión, es decir:

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

¿Cómo puede ser configurado ? Gracias de antemano.

EDITAR:
Básicamente, quiero configurar el repositorio de inserción predeterminado para que sea diferente del repositorio de recuperación/extracción predeterminado.

+0

así que básicamente quiere preparar el repositorio de envío predeterminado para ser diferente del repositorio de búsqueda/extracción predeterminado, ¿verdad? tal vez deberías aclarar eso. – kch

+2

bien, es lo mismo pero con menos palabras, :) –

Respuesta

34

Parece que

git config remote.origin.receivepack /bin/false 

Hace empuje para origen remoto falle.

+0

¡¡¡Genial !!!! Eso es exactamente lo que estaba buscando. –

+0

¿Algunos protocolos son de solo lectura? Eso también haría fallar el empuje al repositorio incorrecto. –

+0

@Andrew: Correcto, si clonas a través del protocolo git, estarás configurado. – Cascabel

7

No estoy seguro de que realmente pueda hacer esto en git hoy. La implementación de git-fetch (en builtin-fetch.c) y git-push (en builtin-push.c) llaman a la función interna remote_get (NULL) para identificar el repositorio predeterminado para pull-from/push-to.

Una opción sería crear un alias que especifique su repositorio deseado. Por ejemplo:

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

Entonces usted podría:

git mypush 

para empujar a tu repositorio deseado. No es precisamente lo que quieres, por supuesto. (También puede considerar el argumento --repo para presionar; consulte http://kerneltrap.org/mailarchive/git/2008/10/7/3537694 para obtener una actualización reciente del documento que aclare el argumento --repo.)

+0

Ambos alias para "push repo-for-push" y para "push --repo repo-for-push" son buenas soluciones. Gracias. –

+0

Como se señala en la respuesta de @Novelocrat, a partir de 1.6.4 esto ya no es cierto. –

0

Si pudiera hacer todos sus intentos desde otra sucursal, creo que podría configurar que se ramifican a tiene su propio repositorio separado para empujar a:

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

no he probado esto, y puede que tenga que trabajar un poco más para crear una solución completa. También podría no funcionar para usted, si tiene que presionar desde el máster.

+0

Con esta solución tengo que fusionar manualmente ambas ramas y estar al tanto de la rama actual a git push xor git pull correctamente. No mejor que los alias, si no puedo configurar git para evitar/cancelar/prohibir un git pull o push cuando la rama actual no es la correcta. ¡Gracias! –

+0

Como se señala en la respuesta de @Novelocrat, esto ya no es necesario. –

0

Envuelva el comando "git" en algo que se coma el argumento push. De la parte superior de mi cabeza me escribió esto:

 
~$ 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[@]}" 

Sólo asegúrese de tener el comando envuelta en su camino antes de que el comando git "real".

+0

Buena idea, pero debe estar en el sistema de archivos del usuario y debe verificar el directorio de trabajo actual cuando hay algunos repositorios sin esta restricción. Gracias. –

27

En la versión 1.6.4, Git obtuvo la capacidad de tener una extracción remota de una URL y pulsar otra, utilizando la configuración de configuración remote.name.pushurl. Puedo imaginar un comportamiento extraño si el repositorio de inserción no rastrea el repositorio de extracción, pero sospecho que Git simplemente intentará adelantar el repositorio de inserción desde la (s) rama (s) corriente/rastreo/coincidencia sin tener en cuenta lo que tirará cuando le pregunte al control remoto del mismo nombre.

Por ejemplo, si usted quiere tirar a través del protocolo git anónima, pero empujar a través de SSH (tal vez necesite un valor de una llave SecurID o algo para autenticar):

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