Was ist der Unterschied zwischen „git lfs fetch“, „git lfs fetch –all“ und „git lfs pull“?

Lesezeit: 5 Minuten

Benutzer-Avatar
Gabriel Staples

Trotz benutzt git seit Jahren, finde ich git lfs (git Speicher für große Dateien) selbst auf einer sehr einfachen Ebene ziemlich verwirrend zu verwenden. Kann jemand den Unterschied zwischen diesen 3 Befehlen erklären?:

  1. git lfs fetch
  2. git lfs fetch --all
  3. git lfs pull

Verwandt:

  1. Ziehen Sie ALLE Dateien aus Git LFS

Benutzer-Avatar
Gabriel Staples

Nach einer Reihe von Studien und dem Herausfinden, wo sich die Hilfeseiten befinden, bin ich zu folgendem Schluss gekommen:

Wie benutzt man git lfs als Basisbenutzer

Dabei geht es um die Frage: „Was ist der Unterschied zwischen git lfs fetch, git lfs fetch --all, git lfs pullund git lfs checkout?”

Zusammenfassung

# Fetch git lfs files for just the currently-checked-out branch or commit (Ex: 20
# GB of data). This downloads the files into your `.git/lfs` dir but does NOT
# update them in your working file system for the branch or commit you have 
# currently checked-out.
git lfs fetch

# Fetch git lfs files for ALL remote branches (Ex: 1000 GB of data), downloading
# all files into your `.git/lfs` directory.
git lfs fetch --all

# Check out, or "activate" the git lfs files for your currently-checked-out
# branch or commit, by updating all file placeholders or pointers in your
# active filesystem for the current branch with the actual files these git lfs
# placeholders point to.
git lfs checkout

# Fetch and check out in one step. This one command is the equivalent of these 2
# commands:
#       git lfs fetch
#       git lfs checkout
git lfs pull
#
# Note that `git lfs pull` is similar to how `git pull` is the equivalent
# of these 2 commands:
#       git fetch
#       git merge

So, ein allgemeiner, empfohlener Arbeitsablauf um Ihre zu überprüfen git Dateien und dein git lfs Dateien könnten so aussehen:

git checkout main   # check out your `main` branch
git pull            # pull latest git files from the remote, for this branch
git lfs pull        # pull latest git lfs files from the remote, for this branch

# OR (exact same thing)
git checkout main   # check out your `main` branch
git pull            # pull latest git files from the remote, for this branch
git lfs fetch       # fetch latest git lfs files from the remote, for this 
                        # branch
git lfs checkout    # check out all git lfs files for this branch, replacing 
                        # git lfs file placeholders with the actual files

Einzelheiten

1. git lfs fetch

Aus git lfs fetch --help (Betonung hinzugefügt):

Laden Sie Git-LFS-Objekte unter den angegebenen Refs von der angegebenen Remote herunter. Siehe „Default remote“ und „Default refs“ für Informationen darüber, was passiert, wenn Sie nichts angeben.

Das macht nicht aktualisieren Sie die Arbeitskopie.

Das ist also genau so, als würde man es tun git fetch (wo es Remote-Inhalte zu Ihrem lokal gespeicherten Remote-Tracking abruft versteckt Zweige), außer es ist für git lfs-gesteuerte Dateien.

Es holt die git lfs Dateiinhalt zu Ihrer .git/lfs Verzeichnis, glaube ich, aktualisiert aber NICHT Ihr aktives Dateisystem (den aktuell ausgecheckten Zweig) mit diesen Dateien.

Von weiter unten im Hilfemenü (Hervorhebung hinzugefügt):

Standardfernbedienung

Ohne Argumente Downloads von der Standardfernbedienung abrufen. Die Standard-Fernbedienung
ist das gleiche wie für git fetchdh basierend auf der Remote-Zweig, den Sie zuerst verfolgenoder Ursprung Andernfalls.

Standard-Referenzen

Wenn keine Refs als Argumente angegeben werden, wird die derzeit ausgecheckt ref wird genutzt. Darüber hinaus werden, sofern aktiviert, kürzlich geänderte Refs und Commits ebenfalls eingeschlossen. Einzelheiten finden Sie unter “Letzte Änderungen”.

Beachten Sie, dass sich die „aktuell ausgecheckte Referenz“ auf Ihre bezieht aktuell ausgecheckter Branch oder Commit.

2. git lfs fetch --all

Wohingegen git lfs fetch ruft standardmäßig nur den Inhalt für Ihren aktuell ausgecheckten Branch oder Commit ab, git lfs fetch --all checkt ALLE Inhalte für ALLE Remote-Zweige aus. Bei einem gigantischen Firmen-Mono-Repo bedeutet das git lfs fetch holen könnte 20GB von Daten, während git lfs fetch --all holen könnte 1000GB von Dateien. Schließen Sie in einem solchen Fall NICHT ein --all wenn nicht:

  1. Sie müssen unbedingt, ODER
  2. Die abgerufene Datenmenge ist immer noch relativ gering

Aus git lfs fetch --help (Betonung hinzugefügt):

* --all:

Laden Sie alle Objekte herunter, die von einem beliebigen Commit referenziert werden, das über die als Argumente bereitgestellten Refs erreichbar ist. Wenn keine Referenzen angegeben sind, dann alle Refs werden abgerufen. Dies dient hauptsächlich Sicherungs- und Migrationszwecken. Nicht kombinierbar mit
--recent oder --include/--exclude. Ignoriert alle global konfigurierten Einschluss- und Ausschlusspfade, um sicherzustellen, dass alle Objekte heruntergeladen werden.

3. git lfs pull

So wie git pull ist die Kombination aus git fetch und git merge, git lfs pull ist die Kombination aus git lfs fetch und git lfs checkout.

Aus git lfs pull --help (Betonung hinzugefügt):

git lfs pull [options] [<remote>]

Laden Sie Git-LFS-Objekte für die derzeit ausgecheckte Referenz herunter und aktualisieren Sie die Arbeitskopie mit den heruntergeladenen Inhalten, falls erforderlich.

Dies entspricht der Ausführung der folgenden 2 Befehle:

git lfs fetch [options] [<remote>]
git lfs checkout

Da stellt sich die Frage: „Was macht git lfs checkout tun?”:

4. git lfs checkout

Dieser Befehl kopiert die git lfs Dateien von Ihrem .git/lfs Verzeichnis in Ihren aktiven, funktionierenden Baum für die aktuelle Referenz (Zweig oder Commit), die Sie gerade ausgecheckt haben.

Aus git lfs checkout --help:

Versuchen Sie sicherzustellen, dass die Arbeitskopie Dateiinhalte für Git-LFS-Objekte für die aktuelle Referenz enthält, sofern die Objektdaten verfügbar sind. Lädt keine Inhalte herunter; sehen git lfs fetch dafür.

Checkout durchsucht die aktuelle Referenz nach allen erforderlichen LFS-Objekten. Wenn dann eine Datei entweder in der Arbeitskopie fehlt oder Platzhalter-Zeigerinhalte mit demselben SHA enthält, wird der echte Dateiinhalt geschrieben, vorausgesetzt, wir haben ihn in der lokalen Datei Laden. Geänderte Dateien werden nie überschrieben.

Ein oder mehr <glob-pattern>s können als Argumente angegeben werden, um den Satz von Dateien einzuschränken, die aktualisiert werden. Glob-Muster werden gemäß dem in beschriebenen Format abgeglichen gitignore(5).

Und es liefert einige Beispiele. Ex:

Beispiele

  • Checken Sie alle fehlenden Dateien oder Platzhalter aus:

    $ git lfs checkout
    
  • Checken Sie einige bestimmte Dateien aus:

    $ git lfs checkout path/to/file1.png path/to.file2.png
    

Verwandt

  1. https://www.git-tower.com/learn/git/faq/difference-between-git-fetch-git-pull

1019440cookie-checkWas ist der Unterschied zwischen „git lfs fetch“, „git lfs fetch –all“ und „git lfs pull“?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy