Wie kann man nach dem Festschreiben in git automatisch pushen?


84

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)?


1
Welches Protokoll verschieben Sie? Wenn Sie zur Eingabe eines Kennworts aufgefordert werden, gehe ich davon aus, dass dies entweder SSH oder HTTP ist.
Mark Longair

1
Außerdem ist es bei Git-Fragen immer hilfreich, zumindest zu erwähnen, welches Betriebssystem Sie verwenden.
Mark Longair

1
Ich bezweifle die Weisheit eines solchen Aufbaus. Dadurch entfällt die Möglichkeit, Ihre Änderungen in einen anderen Satz von Commits umzuwandeln (insbesondere Neuausrichtung). Ich mache zu viele Fehler, als dass ein solches Setup für mich nützlich wäre.
jpmc26

Antworten:


139

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 .netrcDatei 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-agentauf 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 originoder einen anderen Zweig als verschieben möchten master. Stellen Sie sicher, dass Sie diese Datei ausführbar machen.


3
Ssh-agent konnte sich nicht an meine Passphrase erinnern, musste sie also leer machen. Hoffe , dass meine Frau mein Konto nicht :) Hack
Ulu

Apropos Anpassung: Was ist, wenn ich einige, aber nicht alle Zweige auf diese Weise verschieben möchte? Zum Beispiel möchte ich nur die Zweige automatisch pushen, bei denen ein entsprechender entfernter Zweig .git/configmit dem Präfix angegeben ist feature/xy/.
Acumenus

5
Git Push - alle Herkunft
Yada

4
chmod + x .git / hooks / post-commit
UnchartedWorks

33

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").


Für die erste Zeile musste ich verwenden #!/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.
Oyalhi

Vielen Dank für den Kommentar, @oyalhi, ich habe die Shebang-Zeile in der Antwort aktualisiert. Es sollte jetzt besser portieren!
14.

Hallo, ich erhalte diesen Fehler: .git / hooks / post-commit: Zeile 3: Unerwarteter EOF bei der Suche nach übereinstimmendem `` '.git / hooks / post-commit: Zeile 17: Syntaxfehler: unerwartetes Dateiende
wwwwwwwwwwww

Hey, tatsächlich gab es einen verlorenen Backtick. Ich habe die Antwort aktualisiert, bitte versuchen Sie es erneut
i4h

9

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.


Ich würde Mark Longairs Antwort positiv bewerten , wenn ich könnte.
Colin R

1
Warte was? Colin R ist jetzt in den Top 2% :)
Post Self

3

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 .


Es ist nicht erforderlich ssh-agent, verwenden Sie einfach eine andere Passphrase-weniger git-nur- sshSchlüssel : ssh-keygen -t ed25519 -f ~/.ssh/id_pushonly. echo $'\nHost pushonly\nHostname DESTINATION\nIdentityFile ~/.ssh/id_pushonly\n' >> ~/.ssh/config. Auf DESTINATIONconfigure git-shellwie 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 COMMANDlaufen muss git-shell -c COMMANDauf DESTINATION. Zu COMMANDsehenman git-shell
Tino

@Tino Danke. Warum verwenden Sie das digitale Signaturschema -t ed25519? Ich benutze im Allgemeinen -t rsa, obwohl vor kurzem ich hinzufügen müssen , -m PEMum ssh-keygen( stackoverflow.com/a/53645530/6309 , stackoverflow.com/a/53729009/6309 ).
VonC

@Tino Ich verstehe, dass rsa langsamer und weniger sicher ist (wenn seine Länge weniger als 2048 Bit beträgt : bagja.net/blog/upgrade-ssh-key-to-ed25519.html ), aber ich arbeite mit älteren OpenSh-Servern, die dies möglicherweise tun eine ed255519-Signatur nicht richtig interpretieren.
VonC

Ich benutze hauptsächlich, ed25519weil 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 sshdich mit alten s zu tun habe , erstelle ich normalerweise einen speziellen Schlüssel für sie und konfiguriere diesen dann in ~/.ssh/config.
Tino

0

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:

  1. Ü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
    
  2. 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
    
  3. 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).


0

Hier ist ein Bash-Skript, mit dem Git automatisch pushzu einem Remote-Repo wechselt

  1. Überprüfen Sie automatisch ssh-agent
  2. Passphrase automatisch mit Expect-Skript senden
  3. Nutzung ist einfach: $ cd /path/to/your/repositorydann$ 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 /binVerzeichnis, damit es mit nur einem $ pushBefehl aufgerufen werden kann

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

0

Wenn Sie Husky verwenden, wird Ihre post-commitHooks-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"`
    }
  }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.