Es ist eine Katastrophe, dass nach 16 Jahren (2005) der Verwendung von git
gibt es keinen einfachen und offensichtlichen Weg, um ausschließen eine Datei, wenn sie sich tief in einer Verzeichnishierarchie befindet, die ansonsten ignoriert werden sollte. Stattdessen müssen wir auf verrückte Dinge wie das wiederholte Durchforsten der Struktur und das Ausschließen und Einfügen von Verzeichnissen in der richtigen Reihenfolge zurückgreifen. Etwas, das man sich unmöglich merken kann, wenn man es 4 Mal im Jahr machen muss.
Die einzige intelligente, aber sehr merkwürdige Alternative ist die Verwendung der git add --force
. Etwas, das zwangsläufig irgendwann scheitern muss, wenn man nicht nur mit dem Gitted Repo arbeitet.
Deshalb habe ich eine kleine Bash-Funktion geschrieben, um dies für Sie zu beheben, für einfaches Kopieren und Einfügen. Lassen Sie mich zuerst den Einzeiler erklären:
f=0; y='';for x in $(echo "uploads/rubbish/stuff/KEEP_ME/a.py" | tr '\/' '\n'); do y="$y/$x"; if [ $(($f)) -eq 0 ]; then y="$x"; f=1; fi; echo -e '!'"$y/\n$y/*"; done | sed '$d' |sed -z 's/..$//'; echo;
# output:
!uploads/
uploads/*
!uploads/rubbish/
uploads/rubbish/*
!uploads/rubbish/stuff/
uploads/rubbish/stuff/*
!uploads/rubbish/stuff/KEEP_ME/
uploads/rubbish/stuff/KEEP_ME/*
!uploads/rubbish/stuff/KEEP_ME/a.py
Beschreibung
- Es gibt eine
if
Anweisung, um zu korrigieren, dass der 1. Punkt keine /
.
tr '\/' '\n'
- übersetzen die /
a \n
in Standard-POSIX-Pfaden (um eine Liste zu erhalten)
y="$y/$x"
- das nächste hinzufügen Unterverzeichnis (in der Liste) nach dem vorherigen Verzeichnis .
echo -e '!'"$y/\n$y/*"
-
die 2 Zeilen des Unterverzeichnisses item drucken, die erste mit !
Präfix und 2. mit /*
Postfix .
sed '$d'
- letzte Zeile entfernen
sed -z 's/..$//'
- die letzten 2 Zeichen entfernen /*
ab letzter Zeile
Dann erstellen wir die Funktion:
function gitkeep () { f=0; y='';for x in $(echo "$1" | tr '\/' '\n'); do y="$y/$x"; if [[ f -eq 0 ]]; then y="$x"; f=1; fi; echo -e '!'"$y/\n$y/*"; done | sed '$d' |sed -z 's/..$//'; echo; }
# gitkeep "uploads/rubbish/stuff/KEEP_ME/a"
!uploads/
uploads/*
!uploads/rubbish/
uploads/rubbish/*
!uploads/rubbish/stuff/
uploads/rubbish/stuff/*
!uploads/rubbish/stuff/KEEP_ME/
uploads/rubbish/stuff/KEEP_ME/*
!uploads/rubbish/stuff/KEEP_ME/a
Hier habe ich die Arithmetik vereinfacht if
Anweisung an if [[ f -eq 0 ]];
.
Viel Spaß!
20 Stimmen
Duplikat von stackoverflow.com/q/9162919/321973 (Ich weiß, dass das neuer ist, aber die Antwort dort ist richtiger). Eigentlich diese Antwort ist wahrscheinlich die beste