Datei außerhalb des Git-Repository hinzufügen

Datei außerhalb des Git-Repository hinzufügen

Angenommen, ich habe eine lokale Workstation mit Root-Zugriff und einen Server ohne Root-Zugriff. Ich möchte (hauptsächlich Konfigurations-)Dateien zwischen diesen beiden Computern austauschen. Also richte ich ein Git-Repository mit der obersten Ebene in meinem Home-Verzeichnis ein und füge diese Dateien hinzu. So weit, so gut.

Nehmen wir weiter an, dass es eine Datei gibt, die ich auf beiden Computern benötige. Sie wird mit dem Paketmanager geliefert und wird daher außerhalb meines Home-Verzeichnisses installiert. Sie ist nicht auf dem Server installiert und wird auch nicht auf dem Server installiert. Ich habe jetzt zwei Möglichkeiten:

  1. Ich installiere es lokal mit dem Paketmanager und installiere es manuell auf dem Remote-Server. Auf diese Weise sind die Dateien nicht synchron. Das ist einigermaßen in Ordnung, da die Datei vom Paketmanager stammt und es sich nicht wirklich um eine Datei handelt, an der ich arbeite. Allerdings muss ich es immer separat installieren, wenn ich auf einen neuen Server umziehe, und das passiert häufig. Ich könnte jedoch ein Shell-Skript hinzufügen, das das Paket installiert, und dieses Shell-Skript zum Git-Repository hinzufügen.

  2. Ich installiere es lokal in meinem Home-Verzeichnis und füge es dem Repository hinzu. Auf diese Weise muss ich es nicht separat auf verschiedenen Maschinen installieren, es bleibt synchron, wird aber nicht mehr über den Paketmanager aktualisiert. Das mache ich gerade.

Und hier ist die Frage: Gibt es eine dritte – bessere – Möglichkeit, dies zu tun? Irgendeine gitsymbolische Link-Magie?

Antwort1

Aus Ihrer Beschreibung habe ich entnommen, dass Sie das Shell-Skript auf dem Remote-Computer ausführen möchten. Aber vielleicht wäre es bequemer, ein Shell-Skript einzurichten, das nur auf Ihrem lokalen Computer ausgeführt wird und das Paket aus Ihrem lokalen Paketverzeichnis in Ihr lokales Git-Repository überträgt. Dann könnten Sie Cron oder, noch besser, einen Git-Commit-Hook verwenden, um dieses Skript auszuführen, damit Sie immer synchron sind.

[Auf Anfrage vom Kommentar in die Antwort verschoben]

Antwort2

Ich verwende jetzt den folgenden Pre-Push-Hook:

#!/usr/bin/env bash

# Copy local files that are outside the repository (because they are controlled
# by the package manager) into the repository and commit them
# Although this is a pre-push hook, the files are not included in this push
# See also: http://unix.stackexchange.com/q/321328/58056

#remote="$1"
#url="$2"

localFiles=(
    /usr/bin/rg
    /usr/share/man/man1/rg.1.gz
    /usr/share/vim/vimfiles/autoload/pathogen.vim
)
remoteFiles=(
    /home/foo/pkg/bin/rg
    /home/foo/pkg/man/man1/rg.1
    /home/foo/.vim/autoload/pathogen.vim
)

echo "Execute git pre-push hook"

for idx in "${!localFiles[@]}"; do 
    localFile="${localFiles[$idx]}"
    remoteFile="${remoteFiles[$idx]}"
    echo -n "Copy ${localFile} to ${remoteFile}... "
    cp "${localFile}" "${remoteFile}"
    echo "Done."
    echo -n "Add ${remoteFile} to repository... "
    git add -f "${remoteFile}"
    echo "Done."
done

echo "Commit if there is anything to commit... "
git commit -m "Automatically add files by git pre-push hook" \
    && echo -n "Some files were added and commited (but not pushed) " \
    && echo "by the git pre-push hook"

# Don't interfere with the push, so always exit with success
exit 0

verwandte Informationen