Jak ustawić git na automatyczne wypychanie do zdalnego repozytorium (w tym automatyczne dostarczanie mojego hasła) po każdym zatwierdzeniu do lokalnego repozytorium?
Jak ustawić git na automatyczne wypychanie do zdalnego repozytorium (w tym automatyczne dostarczanie mojego hasła) po każdym zatwierdzeniu do lokalnego repozytorium?
Odpowiedzi:
Najpierw upewnij się, że możesz wysłać ręcznie bez podawania hasła. Jeśli przesyłasz przez HTTP lub HTTPS, będzie to przypadek utworzenia .netrc
pliku z danymi logowania lub dodania nazwy użytkownika i hasła do adresu URL pilota . Jeśli używasz protokołu SSH, możesz utworzyć parę kluczy, w której klucz prywatny nie ma hasła, lub użyć go ssh-agent
do buforowania klucza prywatnego .
Następnie powinieneś utworzyć plik wykonywalny ( chmod +x
) .git/hooks/post-commit
zawierający następujące elementy:
#!/bin/sh
git push origin master
... dostosowywanie tej linii, jeśli chcesz wysłać do pilota innego niż origin
lub wypchnąć gałąź inną niż master
. Upewnij się, że ten plik jest wykonywalny.
.git/config
prefiksie feature/xy/
.
Jeśli zaczniesz używać więcej niż gałęzi głównej, możesz chcieć automatycznie wypchnąć bieżącą gałąź. Mój hook ( .git/hooks/post-commit
) wygląda tak:
#!/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
Przesuwa aktualną gałąź, jeśli może określić nazwę gałęzi za pomocą git symbolic-ref.
„ Jak uzyskać nazwę aktualnej gałęzi w Git? ” Dotyczy tego i innych sposobów uzyskania aktualnej nazwy gałęzi.
Automatyczne wypychanie każdej gałęzi może przeszkadzać podczas pracy w gałęziach zadaniowych, w których spodziewasz się zrobienia kiełbasy (nie będziesz w stanie łatwo zmienić bazy po pchnięciu). Zatem hak nie będzie przepychał gałęzi kończących się zdefiniowanym sufiksem (w przykładzie „_local”).
#!/bin/sh
aby to zadziałało. W przeciwnym razie to powtarzał: error: cannot run .git/hooks/post-commit: No such file or directory
. Dziękuję, najbardziej podoba mi się Twoje rozwiązanie.
Utwórz plik o nazwie „post-commit” w katalogu .git / hooks z zawartością „git push”, chociaż jeśli chcesz automatycznie podać hasło, konieczna będzie modyfikacja.
Ten skrypt git-autopush umożliwia ustawienie przechwytywania po zatwierdzeniu, podobnie do tego, co zostało zalecane w sekcji „ Jak skonfigurować automatyczne przekazywanie? ”.
Ale w przypadku hasła musisz uruchomić plikssh-agent
.
ssh-agent
, wystarczy użyć innego hasła mniej git
-tylko ssh
-klawisz: ssh-keygen -t ed25519 -f ~/.ssh/id_pushonly
. echo $'\nHost pushonly\nHostname DESTINATION\nIdentityFile ~/.ssh/id_pushonly\n' >> ~/.ssh/config
. Podczas DESTINATION
konfiguracji, git-shell
jak pokazano na superuser.com/a/444899/72223 przy użyciu klucza pubkey z ~/.ssh/id_pushonly.pub
. Potrzebny git
-URL to coś w stylu git@pushonly:path/to/repo.git
. Do debugowania: ssh git@pushonly COMMAND
musi działać git-shell -c COMMAND
na DESTINATION
. Do COMMAND
zobaczeniaman git-shell
-t ed25519
? Używam ogólnie -t rsa
, choć ostatnio muszę dodać -m PEM
do ssh-keygen
( stackoverflow.com/a/53645530/6309 , stackoverflow.com/a/53729009/6309 ).
ed25519
dlatego, że daje krótkie i poręczne linki ~/.ssh/authorized_keys
. Bardzo interesujące jest również to, co DJB pisze o ed255519 : Zabezpieczenie przed kanałami bocznymi (Spectre), mniej procesora itp. Przy okazji, gdy sshd
mam do czynienia ze starymi s, zwykle tworzę dla nich specjalny klucz i konfiguruję go w ~/.ssh/config
.
Oto prosta instrukcja wypychania / wyciągania bez podawania hasła przez ssh dla osób używających Linuksa i Windowsa (git bash)
Na Twoim kliencie:
Sprawdź, czy masz wygenerowane klucze 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
Jeśli nie masz żadnego klucza (dwie linie „ls: cannot access ...”), wygeneruj nowy. Jeśli masz któryś z kluczy, pomiń ten krok.
$ 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
Skopiuj swój klucz na zdalny serwer, z którego chcesz pobrać lub wypchnąć za pomocą 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.
Uwaga: podczas tej operacji będziesz musiał podać hasło. Po tym twoje operacje pull / push nie będą żądać hasła.
Uwaga 2: Musisz zalogować się do serwera używając nazwa_użytkownika przynajmniej raz przed użyciem tej procedury (katalog domowy, do którego kopiowane są klucze ssh jest tworzony podczas pierwszego logowania)
Oto skrypt bash dla gita, który automatycznie przenosi się push
do zdalnego repozytorium
$ cd /path/to/your/repository
wtedy$ push
Umieść ten skrypt na przykład w pliku $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
Połącz go z /bin
katalogiem, aby można go było wywołać za pomocą $ push
polecenia
$ sudo ln -s $HOME/.ssh/push /bin/push
$ chmod +x /bin/push
Jeśli używasz Husky, post-commit
domyślnie nadpisze plik hooks.
Używamy tego polecenia w package.json, aby automatycznie zmienić bazę i wypchnąć wszystkie zatwierdzenia do mastera. (Pierwszy bieg yarn add --dev git-branch-is
.)
"husky": {
"hooks": {
"post-commit": "git-branch-is master && git rebase origin master && git push origin master"`
}
}