web-dev-qa-db-de.com

Wie kann ein bestimmtes Commit mit Tiefe 1 flach geklont werden?

Ist es möglich, ein bestimmtes Commit in einem Repository, d. H. Mit Tiefe 1, flach zu klonen? Etwas wie

git clone http://myrepo.git 728a4d --depth 1

um den Repository-Status zu erhalten, wie er sich beim Festschreiben befindet, verwenden Sie SHA 728a4d...?

Die Motivation besteht darin, nicht das gesamte Repository klonen zu müssen und dann dieses bestimmte Commit zu überprüfen, wenn wir nur am Zustand des Repositorys bei diesem bestimmten Commit interessiert sind.

50
Chin

Ab Git 2.5.0 (das auf both der Client- und Serverseite verfügbar sein muss) können Sie auf der Serverseite uploadpack.allowReachableSHA1InWant=true Festlegen, um das Abrufen bestimmter SHA1s zu ermöglichen:

git init
git remote add Origin <url>
git fetch --depth 1 Origin <sha1>
git checkout FETCH_HEAD

Beachten Sie, dass ich keine Syntax gefunden habe, um dies direkt mit git clone Zu tun.

41
sschuberth

HINWEIS: Mein Beispiel hilft nicht beim Klonen mit einem Commit-Hash, aber es hilft beim Klonen eines Tags und bei der Erstellung eines kompakten Repositorys.

Wenn Sie nur ein Commit in Ihrem "Klon" haben müssen und Sie werden Commit-Hash verwenden, kurze Antwort ist [~ # ~] nein [ ~ # ~] .

Ich benutze diese Befehlskonstruktion (getestet auf v2.13.2.windows.1 ) für Tags:

git clone --depth 1 [email protected]:VENDOR/REPO.git --branch 1.23.0 --single-branch

1.23.0 - Es kann sich entweder um einen Festschreibungs-Hash oder einen Zweig handeln.

Vollständiges Beispiel:

$ git clone --depth 1 [email protected]:Seldaek/monolog.git --branch 1.23.0 --single-branch
Cloning into 'monolog'...
remote: Counting objects: 201, done.
remote: Compressing objects: 100% (188/188), done.
remote: Total 201 (delta 42), reused 32 (delta 5), pack-reused 0
Receiving objects: 100% (201/201), 190.30 KiB | 0 bytes/s, done.
Resolving deltas: 100% (42/42), done.
Note: checking out 'fd8c787753b3a2ad11bc60c063cff1358a32a3b4'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

$ cd monolog

.git dir size ( 267K vs 2.6M mit vollem clone):

$ du -h --max-depth=0 .git
267K    .git

Ich möchte bezeichnen, --branch kann ein Tag/einen Zweig annehmen.

https://git-scm.com/docs/git-clone#git-clone---branchltnamegt

--branch kann auch Tags nehmen und das HEAD bei diesem Commit im resultierenden Repository entfernen.

[~ # ~] upd [~ # ~]

Kurz gesagt, es kann "refs" dauern. Sie können hier mehr lesen: Was bedeutet die git-Fehlermeldung "Server erlaubt keine Anfrage für ein unbeworbenes Objekt"?

Auch gibt es keine Tricks wie:

git fetch --depth 1 Origin <COMMIT_HASH>

Vielen Dank an @BenjiWiebe für den Hinweis auf meinen Fehler.

12
Kirby

Die unmittelbare Antwort lautet: Sie können nicht.
Warum? Eine ausführliche Erklärung finden Sie hier: Warum gibt es keine Git-Clone-spezifische Commit-Option?

Was kannst du noch tun?

Wie klone ich ein Repository auf ein bestimmtes Commit? (vollständiger Klon)

# Create empty repository to store your content
git clone <url>
git reset <sha-1> --hard

Mehr Info:

Wie klone ich einen Zweig?

git clone <url> --branch <branch_name> --single-branch <folder_name>

Wie klone ich nur das letzte Commit eines bestimmten Zweigs?

git clone <url> --depth=1 --branch <branch_name> --single-branch <folder_name>

Wie kann ein bestimmtes Commit mit Tiefe 1 flach geklont werden?

Wie @sschuberth auskommentierte: --depth impliziert --single-branch.

Verwenden Sie anstelle des Klons den Befehl fetch:

# fetch a commit (or branch or tag) of interest
# In this case you will have the full history of this commit
git fetch Origin <sha1>
4
CodeWizard

Versuchen Sie, while in bash zu verwenden:

git clone --depth=1 $url
i=1; while ! git show $sha1; do git fetch --depth=$((i+=1)); done

Dies ist ziemlich langsam, da jedes Commit einzeln abgerufen wird. Sie könnten das Inkrement erhöhen (um Commits in Stapeln abzurufen und die Leistung über ein Netzwerk zu verbessern), aber es ist immer noch ein Brute-Force-Ansatz.

2
Corin