Rsync-Ordner, während .gitignore-Dateien in verschiedenen Tiefen ausgeschlossen werden

8

Ich versuche also, an einem Befehl zu arbeiten, um einen Quellordner mit einer Struktur wie der folgenden zu synchronisieren:

- app.js
- .gitignore
- src/
- src/logs/
- src/logs/.gitignore

Beim ersten .gitignore würde eine Reihe von Dateien ignoriert. Typisches Zeug. Der zweite würde wie folgt aussehen:

*
!.gitignore

Diese Technik wird verwendet, wenn Sie ein Verzeichnis einchecken möchten, in dem sich keine der Dateien befindet. Es können auch mehr .gitignores im gesamten Verzeichnis vorhanden sein - dies ist nur ein Szenario. Meine Frage lautet also: Ist es möglich, dass rsync alle .gitignores relativ zu dem Verzeichnis interpretiert, in dem sie sich befinden?

Mein erster Versuch war folgender:

  1. Glob alle .gitignores im Verzeichnis.
  2. Build-Befehl, der ungefähr so ​​aussieht:

rsync --exclude-from=.gitignore --exclude-from=src/logs/.gitignore --exclude-from=some/other/folder/.gitignore [source] [destination]

Dies funktionierte jedoch nicht wie erwartet für mich. Alles wird ignoriert, da alle Gitignore-Dateien so gelesen werden, als ob sie sich im Stammverzeichnis befinden. Gibt es eine Möglichkeit, dies zu tun, ohne nach allen .gitignores suchen zu müssen und eine Masterdatei mit neu geschriebenen Pfaden zu erstellen, die sich alle auf das Stammverzeichnis beziehen?

Vielen Dank!

Jeff Howard
quelle

Antworten:

15

Dies weist rsync an, in jedem Verzeichnis nach einer Datei zu suchen .gitignore:

rsync --filter='dir-merge,-n /.gitignore' [...]

Das sollte machen was du willst.

Das -nnach dem dir-mergebedeutet, dass ( -) die Datei nur Ausschlüsse angibt und ( n) Regeln nicht von Unterverzeichnissen geerbt werden.

wurtel
quelle
Dies war eine großartige Antwort. Vielen Dank. Ich würde dich +1, wenn ich könnte.
Jeff Howard