Ich habe zwei Ordner:
- ORIGINAL/
- ORIGINAL_AND_MY_CHANGES /
Mein Freund hat eine Kopie von ORIGINAL /. Ich möchte MY_CHANGES.tgz generieren - es sollte nur neue / geänderte Dateien von ORIGINAL_AND_MY_CHANGES / im Vergleich zu ORIGINAL / enthalten. Mein Freund kann es also in seine Kopie von ORIGINAL / auspacken und ORIGINAL_AND_MY_CHANGES / erhalten. Wie kann ich das machen?
PS Ich habe es versucht, diff
aber es kann keine Binärdaten speichern und rsync --link-dest
- es generiert harte Links, die im Archiv unbrauchbar sind.
PPS In meinem Fall kann die Änderungszeit nicht verwendet werden, um zu entscheiden, welche Datei geändert wurde.
Antworten:
Mit rsync
Was Sie tun, ist im Wesentlichen eine inkrementelle Sicherung: Ihr Freund (Ihre Sicherung) verfügt bereits über die Originaldateien, und Sie möchten ein Archiv erstellen, das die Dateien enthält, die Sie von diesem Original geändert haben.
Rsync bietet Funktionen für inkrementelle Sicherungen.
-a
bedeutet, alle Attribute (Zeiten, Besitz usw.) zu erhalten.-c
bedeutet, den Dateiinhalt zu vergleichen und sich nicht auf Datum und Größe zu verlassen.--compare-dest=/some/directory
bedeutet, dass Dateien, die unter diesem Verzeichnis und dem Quellbaum identisch sind, nicht kopiert werden. Beachten Sie, dass der Pfad relativ zum Zielverzeichnis ist.Rsync kopiert alle Verzeichnisse, auch wenn dort keine Dateien landen. Führen Sie Folgendes aus, um diese leeren Verzeichnisse zu entfernen
find -depth CHANGES_ONLY -type d -empty -delete
(oder führen Sie sie aus, wenn Siefind
kein-delete
und-empty
habenfind -depth CHANGES_ONLY -exec rmdir {} + 2>/dev/null
).Dann machen Sie das Archiv aus dem
CHANGES_ONLY
Verzeichnis.Der Fußgängerweg
Durchsuchen Sie das Verzeichnis mit Ihrer Datei. Überspringen Sie Dateien, die mit dem Original identisch sind. Erstellen Sie nach Bedarf Verzeichnisse im Ziel. Kopieren Sie geänderte Dateien.
quelle
ORIGINAL
undORIGINAL_AND_MY_CHANGES
einen Zweig erstellen . Dann finden Sie esCHANGES
mit einem scm-Befehl heraus.ORIGINAL
es sich um Android-Plattformquellen (3 GB, 126000 Dateien). Selbst das Ausführen von rsync dauert ca. 15-20 Minuten. Ich denke, dass das Hinzufügen all dieser Dinge unter Quellcodeverwaltung zu viel Platz und Zeit in Anspruch nehmen wird.Der Befehl
würde eine Batch-DATEI erstellen, die die erforderlichen Änderungen enthält (ohne etwas zu ändern).
Der Patch kann an einer anderen Stelle angewendet werden, an der Sie die Batch-Datei mit nehmen
quelle