rsync schließt einen Ordner aus, der ein .git-Unterverzeichnis enthält (--filter)

rsync schließt einen Ordner aus, der ein .git-Unterverzeichnis enthält (--filter)

Ich möchte mehrere Ordner sichern. In diesen mehreren Ordnern möchte ich alle Verzeichnisse ausschließen, die ein .gitUnterverzeichnis enthalten. Also zum Beispiel in dieser Ordnerhierarchie:

├── gitrepo        <-- exclude this completely
|   └── .git/...
│   └── file1
└── nogitrepo      <-- keep this
    └── file2

Ich habe bereits alle .git-Verzeichnisse erfolgreich mit ausgeschlossen --exclude=.git, aber da sich der gesamte Inhalt der lokalen Repositories bereits im Remote-SCM befindet, möchte ich ihn nicht in mein Backup einschließen.

Ich kenne das --filterArgument von rsync. Ich habe mir die Manpage angesehen, bin mir aber nicht sicher, ob sie das Problem lösen wird. Ich bin jedoch optimistisch, da rsync vorher eine Dateiliste aller enthaltenen Dateien zusammenstellt.

Ist es mit rsync möglich, alle Ordner auszuschließen, die Git-Repositorys sind? So etwas wie die Regel pro Verzeichnis für --filter?

Antwort1

Richten Sie Ihre SRCund DESTVariablen ein, zum Beispiel:

SRC="./"
DEST="../BACKUP/"

findUm alle .gitVerzeichnisse zu finden , können Sie Folgendes verwenden :

find "${SRC}" -type d -name '.git'

Dies wird ${SRC}/.gitjedoch auch einschließen (was zu wird ${SRC}und somit letztendlich " ignoriert.alles")... um dies zu vermeiden, verwenden Sie -mindepth 2:

find "${SRC}" -mindepth 2 -type d -name '.git'

Als nächstes entfernen Sie die nachfolgenden /.gitKomponenten:

find "${SRC}" -mindepth 2 -type d -name '.git' \
    | sed -re 's!/.git$!!g'

Da rsyncdas Arbeitsverzeichnis auf die Quelle festgelegt wird, müssen wir ${SRC}auch den Anfangsbuchstaben aus den Ergebnissen entfernen:

find "${SRC}" -mindepth 2 -type d -name '.git' \
    | sed -re 's!^'"${SRC}"'!!g;s!/.git$!!g'

Verbinden Sie dies abschließend mit dem rsyncBefehl, indem Sie verwenden --exclude-fromund übergeben -(dh: stdin):

find "${SRC}" -mindepth 2 -type d -name '.git' \
    | sed -re 's!^'"${SRC}"'!!g;s!/.git$!!g' \
    | rsync -av --exclude-from - "${SRC}" "${DEST}"/

NOTIZ:das wird nicht ankommenbeliebignicht verfolgte/geänderte Dateien.

Antwort2

find your_DIR_for_BACKUP -name .git | sed 's/\/.git//g' > ~/exclude_repos

und führen Sie rsync mit der Option --exclude-from aus. Wählen Sie die ausgefüllte Datei ~/exclude_repos aus.

rsync --exclude-from ~/exclude_repos your_DIR_for_BACKUP_SRC DST

verwandte Informationen