Dieser Artikel vermittelt Ihnen relevantes Wissen über GIT Warehouse-Verschlankung und GIT LFS-Migrationsanweisungen. Ich hoffe, dass er für alle hilfreich ist.
Ich habe CI/CD zuvor bei einigen Git-Projekten verwendet und festgestellt, dass der Git-Klon von Jenkins fehlgeschlagen ist und die Einstellung von Tiefe und Klonzeit fehlgeschlagen ist. Wir können nur Strategien wie Lagerverkleinerung in Betracht ziehen. Es wurde festgestellt, dass das Warehouse viele Binärdateien enthält und diese sich häufig ändern. Dieser Vorgang führt dazu, dass das Git-Warehouse exponentiell wächst und sich schnell erweitert. Git selbst ist nur für die Verwaltung von Textdateien geeignet.
Eine weitere interessante Geschichte ist, dass ich einmal einen Kollegen hatte, der sich mit Grafikprogrammierung beschäftigte. Der Quellcode dieser Sprache lag in Form von Bildern vor und die Datei war sehr groß. Sie wurde auf Git verwaltet und die Projekte des kleinen Unternehmens wurden geändert häufig, was dazu führte, dass die Festplatte des Git-Servers nicht lange danach für mehrere seiner Git-Repositorys voll war.
Obwohl Git nie für die Verwaltung von Binärdateien geeignet war, scheint Git jetzt standardmäßig Git LFS bereitzustellen, ein Plug-In, das speziell für die Verwaltung großer Dateien entwickelt wurde.
Das Grundprinzip besteht einfach darin, einen Dateizeiger (Text) anstelle der tatsächlichen Dateispeicherung zu verwenden. Git speichert nur den Änderungsverlauf des Dateizeigers und nicht der gesamten Binärdatei und stellt bei Verwendung automatisch Hooks bereit, was praktisch ist Beim Klonen, Ziehen, Zurücksetzen und anderen Vorgängen werden die Quellbinärdateien dieser Dateizeiger automatisch abgerufen. In ähnlicher Weise konvertiert Git beim Aktualisieren der Binärdatei automatisch die Quelldatei in einen Dateizeiger und gibt sie in das Git-Protokoll ein Gleichzeitig wird die Quelldatei in lfs hochgeladen. Auf Benutzerebene ist der Einsatz von GIT LFS also eigentlich sinnlos.
Das Obige stellt GIT LFS kurz vor. Als nächstes werden wir direkt darüber sprechen, wie man migriert, anstatt wie man LFS von Grund auf verwendet.
Dies liegt daran, dass Sie bei der Verwendung des Git-Warehouse häufig feststellen, dass das Warehouse sehr groß und das Klonen sehr langsam ist, und dann über die Verwendung von LFS nachdenken.
Für die Migration müssen wir über Administratorrechte für das Lager verfügen und den Schutz des geschützten Zweigs aufheben. Die spezifische LFS-Migration ist hauptsächlich in die folgenden Schritte unterteilt.
Es ist am besten, vor der Migration ein Backup zu erstellen und gut mit Ihren Teamkollegen zu kommunizieren. Schließlich handelt es sich bei der Operation um Hochrisikooperationen, und es ist leicht, die Schuld auf sich zu nehmen.
GIT LFS-ServerkonfigurationWenn Sie einige selbst erstellte Git-Dienste erstellen, müssen Sie möglicherweise LFS auf der Serverseite aktivieren, z. B. Gitlab. GIT LFS-Client-InstallationDas Git-Installationspaket für Windows wird mit diesem Plug-in geliefert. Es ist keine zusätzliche Installation erforderlich, Link. Probieren Sie die folgenden Befehle in der Befehlszeile aus.git lfsWenn eine Informationsausgabe ähnlich dem Hilfedokument vorliegt, bedeutet dies, dass bereits ein Git-LFS-Client vorhanden ist.
git-lfs/2.11.0 (GitHub; windows amd64; go 1.14.2; git 48b28d97)git lfs <command> [<args>]Git LFS is a system for managing and versioning large files in association with a Git repository. Instead of storing the large files within the Git repository as blobs, Git LFS stores special "pointer files" in the repository, while storing the actual file contents on a Git LFS server. The contents of the large file are downloaded automatically when needed, for example when a Git branch containing the large file is checked out.Git LFS works by using a "smudge" filter to look up the large file contents based on the pointer file, and a "clean" filter to create a new version of the pointer file when the large file's contents change.It also uses a pre-push hook to upload the large file contents to the Git LFS server whenever a commit containing a new large file version is about to be pushed to the corresponding Git server.</args></command>
git lfs installMigrieren Sie das lokale historische Lager. Grundidee der LFS-Migration: LFS schreibt den lokalen Verlauf neu – > Force Push überschreibt das entfernte Ende, um den Migrationseffekt zu erzielen.
git lfs migrate import --include="*.bin,*.lib,*.so,*.dll,*.a,*.param,*.zip,*.gz" --everything
migrate: Sorting commits: ..., done. migrate: Rewriting commits: 100% (193/193), done. develop bacb490a80ea46d73bd3866c2e7cf7ad199ce5eb -> 72884bcb4629417bad73ea3d485d08a0708909cd feature/npu-platform a3645632756becc527c7f4d58514b3c479f824d3 -> e227900a3903b3a6955e4dffee48daeceac6cdff master 1ccdecdcb4b5d6224a6e24c6f87793bfcc15ee4c -> 1d9fc2139600ef3d92a20d65bb5db89021b8c488 0.1.0 07c6b2aa732506f1cc88cedb551f37f376b6efa6 -> 8e55193221dfca9f6bb28ccd9cca85af9c5958c9 1.0.0 0f694efcd7aa9df641836e1ea6eebbb730b940b5 -> 3f9e77575120b6e56b34790c998a362116da75f5 migrate: Updating refs: ..., done.
git lfs ls-files
ausführen, um zu sehen, welche Dateien in die LFS-Verwaltung konvertiert wurden. Überprüfen Sie, ob Auslassungen vorliegen
Zu diesem Zeitpunkt wird die .gitattributes-Datei angezeigt, unabhängig davon, in welchem Zweig Sie sich befinden, und es werden Inhalte ähnlich dem folgenden hinzugefügt.
*.bin filter=lfs diff=lfs merge=lfs -text *.lib filter=lfs diff=lfs merge=lfs -text *.so filter=lfs diff=lfs merge=lfs -text *.dll filter=lfs diff=lfs merge=lfs -text *.a filter=lfs diff=lfs merge=lfs -text *.param filter=lfs diff=lfs merge=lfs -text *.zip filter=lfs diff=lfs merge=lfs -text *.gz filter=lfs diff=lfs merge=lfs -text
version https://git-lfs.github.com/spec/v1 oid sha256:9171c8350d72ccca6ad60ac80b577157ad1f9fd44ca05744216e02ccbfcdf491 size 10260
Seit der Migration von lfs schreibt alle Commits neu und ändert den Hash-Wert, daher müssen wir –froce hinzufügen. Dieser Schritt erfordert das Abbrechen des geschützten Zweigs (geschützte Zweige können nicht -f sein).
git push --force --all
Auf diese Weise ist die LFS-Migration des Remote-Warehouse abgeschlossen
git lfs pull
git reflog expire --expire-unreachable=now --all git gc --prune=now
lfs直观来讲更多的是针对仓库大clone慢的问题,我这边lfs迁移前后各备份各一个小型远程仓库做测试,
用的测试仓库二进制文件比较小,总大50m内,且变更次数也在个位数。
clone下来的仓库大小对比。
和我预估差不多,总的来说更适合二进制文件频繁变更,如果单纯是文件大,但文件不变更的话,在clone的时候区别不大,毕竟lfs在clone仍有下载源文件的步骤,除开下载,操作文件指针对git来说理论仍会有性能提升,但是可能感知不强。
推荐学习:《Git教程》
Das obige ist der detaillierte Inhalt vonLernen Sie in zehn Minuten die GIT Warehouse-Verschlankung und die GIT LFS-Migrationsanweisungen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!