Wie stelle ich git so ein, dass es nach jedem Commit für das lokale Repo automatisch auf ein Remote-Repo pusht (einschließlich der automatischen Bereitstellung meiner Passphrase)?
Wie stelle ich git so ein, dass es nach jedem Commit für das lokale Repo automatisch auf ein Remote-Repo pusht (einschließlich der automatischen Bereitstellung meiner Passphrase)?
Antworten:
Stellen Sie zunächst sicher, dass Sie manuell pushen können, ohne Ihr Kennwort anzugeben. Wenn Sie über HTTP oder HTTPS pushen, müssen Sie entweder eine .netrc
Datei mit den Anmeldedaten erstellen oder Ihren Benutzernamen und Ihr Kennwort zur URL für die Fernbedienung hinzufügen . Wenn Sie SSH verwenden, können Sie entweder ein Schlüsselpaar erstellen , in dem der private Schlüssel nicht ein Passwort, oder hat die Verwendung ssh-agent
auf Ihren privaten Schlüssel zwischenspeichern .
Dann sollten Sie eine ausführbare ( chmod +x
) Datei erstellen .git/hooks/post-commit
, die Folgendes enthält:
#!/bin/sh
git push origin master
... diese Zeile anpassen, wenn Sie auf eine andere Fernbedienung als origin
oder einen anderen Zweig als verschieben möchten master
. Stellen Sie sicher, dass Sie diese Datei ausführbar machen.
.git/config
mit dem Präfix angegeben ist feature/xy/
.
Wenn Sie mehr als den Hauptzweig verwenden, möchten Sie möglicherweise den aktuellen Zweig automatisch verschieben. Mein hook ( .git/hooks/post-commit
) sieht so aus:
#!/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
Es schiebt den aktuellen Zweig, wenn es den Zweignamen mit git symbolic-ref bestimmen kann.
" Wie erhalte ich den aktuellen Filialnamen in Git? " Behandelt diese und andere Möglichkeiten, um den aktuellen Filialnamen zu erhalten.
Ein automatischer Push für jeden Zweig kann störend sein, wenn Sie in Task-Zweigen arbeiten, in denen eine Wurstherstellung erwartet wird (Sie können nach dem Drücken nicht einfach die Basis wiederherstellen). Der Hook schiebt also keine Zweige, die mit einem definierten Suffix enden (im Beispiel "_local").
#!/bin/sh
, damit es funktioniert. Ansonsten hieß es immer wieder : error: cannot run .git/hooks/post-commit: No such file or directory
. Vielen Dank, ich mag Ihre Lösung am besten.
Erstellen Sie im Verzeichnis .git / hooks eine Datei mit dem Namen "post-commit" mit dem Inhalt "git push". Wenn Sie jedoch automatisch ein Kennwort angeben möchten, sind Änderungen erforderlich.
Mit diesem Git-Autopush- Skript können Sie einen Post-Commit-Hook einrichten, ähnlich dem, was unter " Wie konfiguriere ich das automatische Pushing? " Empfohlen wurde .
Für die Passphrase müssen Sie jedoch a ausführenssh-agent
.
ssh-agent
, verwenden Sie einfach eine andere Passphrase-weniger git
-nur- ssh
Schlüssel : ssh-keygen -t ed25519 -f ~/.ssh/id_pushonly
. echo $'\nHost pushonly\nHostname DESTINATION\nIdentityFile ~/.ssh/id_pushonly\n' >> ~/.ssh/config
. Auf DESTINATION
configure git-shell
wie in gezeigt superuser.com/a/444899/72223 mit pubkey aus ~/.ssh/id_pushonly.pub
. Die benötigte git
-URL ist so etwas wie git@pushonly:path/to/repo.git
. Um Debug: ssh git@pushonly COMMAND
laufen muss git-shell -c COMMAND
auf DESTINATION
. Zu COMMAND
sehenman git-shell
-t ed25519
? Ich benutze im Allgemeinen -t rsa
, obwohl vor kurzem ich hinzufügen müssen , -m PEM
um ssh-keygen
( stackoverflow.com/a/53645530/6309 , stackoverflow.com/a/53729009/6309 ).
ed25519
weil es kurze und handliche Zeilen für gibt ~/.ssh/authorized_keys
. Es ist auch sehr interessant, was DJB über ed255519 schreibt : Sicher gegen Seitenkanäle (Spectre), weniger CPU usw. Übrigens, wenn sshd
ich mit alten s zu tun habe , erstelle ich normalerweise einen speziellen Schlüssel für sie und konfiguriere diesen dann in ~/.ssh/config
.
Hier finden Sie eine einfache Anleitung zum Drücken / Ziehen ohne Passphrase über ssh für Benutzer von Linux und Windows (git bash).
Auf Ihrem Kunden:
Überprüfen Sie, ob Sie SSH-Schlüssel generiert haben:
$ 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
Wenn Sie keinen Schlüssel haben (zwei Zeilen "ls: kann nicht auf ... zugreifen"), generieren Sie einen neuen. Wenn Sie eine der Tasten haben, überspringen Sie diesen Schritt.
$ 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
Kopieren Sie Ihren Schlüssel mit git auf einen Remote-Server, von dem Sie ihn ziehen oder drücken möchten:
$ 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.
Hinweis: Während dieses Vorgangs müssen Sie ein Kennwort eingeben. Danach werden Ihre Pull / Push-Vorgänge kein Passwort mehr anfordern.
Hinweis 2: Sie müssen sich mindestens einmal mit Benutzername beim Server anmelden, bevor Sie dieses Verfahren anwenden können (das Ausgangsverzeichnis, in das SSH-Schlüssel kopiert werden, wird bei der ersten Anmeldung erstellt).
Hier ist ein Bash-Skript, mit dem Git automatisch push
zu einem Remote-Repo wechselt
$ cd /path/to/your/repository
dann$ push
Fügen Sie dieses Skript beispielsweise in eine Datei ein $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
Verknüpfen Sie es mit dem /bin
Verzeichnis, damit es mit nur einem $ push
Befehl aufgerufen werden kann
$ sudo ln -s $HOME/.ssh/push /bin/push
$ chmod +x /bin/push
Wenn Sie Husky verwenden, wird Ihre post-commit
Hooks-Datei standardmäßig überschrieben .
Wir verwenden diesen Befehl in package.json, um Commits automatisch neu zu starten und an den Master zu senden. (Erster Lauf yarn add --dev git-branch-is
.)
"husky": {
"hooks": {
"post-commit": "git-branch-is master && git rebase origin master && git push origin master"`
}
}