¿Cómo presionar automáticamente después de confirmar en git?

84

¿Cómo configuro git para que se envíe automáticamente a un repositorio remoto (incluido el suministro automático de mi frase de contraseña) después de cada confirmación en el repositorio local?

ulu
fuente
1
¿Qué protocolo estás presionando? Si solicita una contraseña, supongo que es SSH o HTTP.
Mark Longair
1
Además, siempre es útil con las preguntas de git mencionar al menos qué sistema operativo está utilizando.
Mark Longair
1
Cuestiono la sabiduría de tal configuración. Esto elimina cualquier posibilidad de reorganizar los cambios en un conjunto diferente de confirmaciones (rebase, especialmente). Cometo demasiados errores para que una configuración como esta termine siendo útil para mí.
jpmc26

Respuestas:

139

Primero, asegúrese de poder presionar manualmente sin proporcionar su contraseña. Si está presionando sobre HTTP o HTTPS, será un caso de crear un .netrcarchivo con los detalles de inicio de sesión o agregar su nombre de usuario y contraseña en la URL del control remoto . Si está utilizando SSH, puede crear un par de claves donde la clave privada no tenga contraseña, o utilizarlo ssh-agentpara almacenar en caché su clave privada .

Luego, debe crear un archivo ejecutable ( chmod +x) .git/hooks/post-commitque contenga lo siguiente:

#!/bin/sh
git push origin master

... personalizar esa línea si desea enviar a un control remoto que no sea origin, o presionar una rama que no sea master. Asegúrese de hacer que ese archivo sea ejecutable.

Mark Longair
fuente
3
No se pudo hacer que ssh-agent recordara mi contraseña, así que tuve que dejarla vacía. Espero que mi esposa no piratee mi cuenta :)
ulu
Hablando de personalización, ¿qué pasa si quiero impulsar algunas, pero no todas las ramas de esta manera? Por ejemplo, quiero insertar automáticamente solo las ramas que tienen una rama remota correspondiente anotada .git/configcon el prefijo feature/xy/.
Acumenus
5
git push --todos los orígenes
Yada
4
chmod + x .git / hooks / post-commit
UnchartedWorks
33

Si comienza a usar más que la rama principal, es posible que desee enviar automáticamente la rama actual. Mi gancho ( .git/hooks/post-commit) se ve así:

#!/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

Empuja la rama actual, si puede determinar el nombre de la rama con git symbolic-ref.

" ¿Cómo obtener el nombre de la rama actual en Git? " Trata de esta y otras formas de obtener el nombre de la rama actual.

Un empuje automático para cada rama puede ser perturbador cuando se trabaja en ramas de tareas en las que se espera que se produzcan algunas salchichas (no podrá rebasar fácilmente después de empujar). Por lo tanto, el gancho no empujará ramas que terminen con un sufijo definido (en el ejemplo "_local").

i4h
fuente
Para la primera línea, tuve que usar #!/bin/shpara que funcionara. De lo contrario, seguía diciendo: error: cannot run .git/hooks/post-commit: No such file or directory. Gracias, me gusta más tu solución.
oyalhi
Gracias por el comentario, @oyalhi, actualicé la línea shebang en la respuesta. ¡Debería portar mejor ahora!
i4h
hola, recibo este error: .git / hooks / post-commit: línea 3: EOF inesperado mientras buscaba `` '.git / hooks / post-commit: línea 17: error de sintaxis: final inesperado del archivo
wwwwwwwwwwww
Oye, de hecho hubo una tilde perdida.
Actualicé
9

Cree un archivo llamado "post-commit" en el directorio .git / hooks con el contenido "git push", aunque si desea proporcionar automáticamente una contraseña, será necesario modificarla.

Colin R
fuente
Votaría a favor la respuesta de Mark Longair si pudiera.
Colin R
1
¿Esperar lo? Colin R está ahora en el 2% superior :)
Publicación propia el
3

Este script de git-autopush le permite configurar un enlace posterior a la confirmación, similar a lo que se ha recomendado en " ¿Cómo configurar la inserción automática? ".
Pero para la frase de contraseña, debe ejecutar un archivossh-agent .

VonC
fuente
No hay ninguna necesidad de que ssh-agent, sólo tiene que utilizar otra frase de contraseña-menos git-sólo sshtecla: ssh-keygen -t ed25519 -f ~/.ssh/id_pushonly. echo $'\nHost pushonly\nHostname DESTINATION\nIdentityFile ~/.ssh/id_pushonly\n' >> ~/.ssh/config. En DESTINATIONconfigure git-shellcomo se muestra en superuser.com/a/444899/72223 utilizando pubkey partir ~/.ssh/id_pushonly.pub. La git-URL necesaria es algo así como git@pushonly:path/to/repo.git. Para depurar: ssh git@pushonly COMMANDdebe ejecutar git-shell -c COMMANDen DESTINATION. Para COMMANDverman git-shell
Tino
@Tino Gracias. ¿Por qué utiliza el esquema de firma digital -t ed25519? Lo uso en general -t rsa, aunque recientemente tengo que agregar -m PEMa ssh-keygen( stackoverflow.com/a/53645530/6309 , stackoverflow.com/a/53729009/6309 ).
VonC
@Tino Entiendo que rsa es más lento, menos seguro (si su longitud es inferior a 2048 bits: bagja.net/blog/upgrade-ssh-key-to-ed25519.html ), pero trato en el trabajo con servidores openssh más antiguos que podrían no interpretar correctamente una firma ed255519.
VonC
Lo uso principalmente ed25519porque da líneas cortas y prácticas para ~/.ssh/authorized_keys. También es muy interesante lo que DJB escribe sobre ed255519 : Seguro contra canales laterales (Spectre), menos CPU, etc. Por cierto, cuando trato con viejos sshds, generalmente creo una clave especial para ellos y luego configuro esto en ~/.ssh/config.
Tino
0

Aquí hay instrucciones simples para presionar / tirar sin proporcionar una frase de contraseña sobre ssh para personas que usan Linux y Windows (git bash)

En su cliente:

  1. Compruebe si ha generado claves ssh:

    $ 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. Si no tiene ninguna clave (dos líneas "ls: can't access ...") genere una nueva. Si tiene alguna de las claves, omita este paso.

    $ 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. Copie su clave al servidor remoto desde el que desea extraer o presionar usando 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: Deberá proporcionar una contraseña durante esta operación. Después de eso, sus operaciones de extracción / inserción no solicitarán contraseña.

Nota 2: Debe iniciar sesión en el servidor usando user_name al menos una vez antes de usar este procedimiento (el directorio de inicio en el que se copian las claves ssh se crea durante el primer inicio de sesión)

Rafał Gnitecki
fuente
0

Aquí está el script bash para que git automáticamente pusha un repositorio remoto

  1. Verificar automáticamente ssh-agent
  2. Envíe automáticamente una frase de contraseña usando un script esperado
  3. El uso es simplemente: $ cd /path/to/your/repositoryentonces$ push

Pon este script en un archivo, por ejemplo $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)
[email protected]:${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

Vincularlo al /bindirectorio para que se pueda llamar con solo un $ pushcomando

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

Si está utilizando Husky, sobrescribirá su post-commitarchivo de ganchos de forma predeterminada.

Estamos usando este comando en package.json para reajustar automáticamente y enviar cualquier confirmación al maestro. (Primera ejecución yarn add --dev git-branch-is).

  "husky": {
    "hooks": {
     "post-commit": "git-branch-is master && git rebase origin master && git push origin master"`
    }
  }
Freewalker
fuente