¿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?
¿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?
Respuestas:
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 .netrc
archivo 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-agent
para almacenar en caché su clave privada .
Luego, debe crear un archivo ejecutable ( chmod +x
) .git/hooks/post-commit
que 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.
.git/config
con el prefijo feature/xy/
.
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").
#!/bin/sh
para 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.
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.
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
.
ssh-agent
, sólo tiene que utilizar otra frase de contraseña-menos git
-sólo ssh
tecla: ssh-keygen -t ed25519 -f ~/.ssh/id_pushonly
. echo $'\nHost pushonly\nHostname DESTINATION\nIdentityFile ~/.ssh/id_pushonly\n' >> ~/.ssh/config
. En DESTINATION
configure git-shell
como 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 COMMAND
debe ejecutar git-shell -c COMMAND
en DESTINATION
. Para COMMAND
verman git-shell
-t ed25519
? Lo uso en general -t rsa
, aunque recientemente tengo que agregar -m PEM
a ssh-keygen
( stackoverflow.com/a/53645530/6309 , stackoverflow.com/a/53729009/6309 ).
ed25519
porque 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 sshd
s, generalmente creo una clave especial para ellos y luego configuro esto en ~/.ssh/config
.
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:
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
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
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)
Aquí está el script bash para que git automáticamente push
a un repositorio remoto
$ cd /path/to/your/repository
entonces$ 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)
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
Vincularlo al /bin
directorio para que se pueda llamar con solo un $ push
comando
$ sudo ln -s $HOME/.ssh/push /bin/push
$ chmod +x /bin/push
Si está utilizando Husky, sobrescribirá su post-commit
archivo 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"`
}
}