Wie kann ich das Git-Repository mit einer bestimmten Revision klonen, wie ich es normalerweise in Mercurial mache:
hg clone -r 3 /path/to/repository
Wie kann ich das Git-Repository mit einer bestimmten Revision klonen, wie ich es normalerweise in Mercurial mache:
hg clone -r 3 /path/to/repository
Antworten:
UPDATE 2 Seit Git 2.5.0 kann die unten beschriebene Funktion serverseitig mit Konfigurationsvariablen aktiviert werden. Hier aktivieren uploadpack.allowReachableSHA1InWant
die GitHub-Funktionsanforderung und das GitHub-Commit diese Funktion . Beachten Sie, dass einige Git-Server diese Option standardmäßig aktivieren, z. B. Bitbucket Server hat sie seit Version 5.5+ aktiviert . In dieser Antwort auf Stackexchange finden Sie ein Beispiel zum Aktivieren der Konfigurationsoption.
UPDATE 11.7 < v < 2.5
Verwenden Sie für Git-Versionen den Git-Klon und den Git-Reset, wie in der Antwort von Vaibhav Bajpai beschrieben
Wenn Sie nicht das vollständige Repository abrufen möchten, sollten Sie es wahrscheinlich nicht verwenden clone
. Sie können immer nur Abrufen verwenden, um den Zweig auszuwählen, den Sie abrufen möchten. Ich bin kein HG-Experte, daher kenne ich die Details nicht, -r
aber in Git können Sie so etwas tun.
# make a new blank repository in the current directory
git init
# add a remote
git remote add origin url://to/source/repository
# fetch a commit (or branch or tag) of interest
# Note: the full history up to this commit will be retrieved unless
# you limit it with '--depth=...' or '--shallow-since=...'
git fetch origin <sha1-of-commit-of-interest>
# reset this repository's master branch to the commit of interest
git reset --hard FETCH_HEAD
git fetch origin <sha1>
funktioniert; Es scheint, als müssten Sie eine benannte Referenz wie ein Tag oder einen Zweignamen übergeben. Siehe kerneltrap.org/mailarchive/git/2009/1/13/4707444
git fetch origin <SHA1>
zu jeder gewünschten Revision wechseln konnte, nachdem ich den Master von der Fernbedienung abgerufen und reset --hard
den Zweig lokal instanziiert hatte. Ich konnte die einzelnen Revisionen nicht direkt abrufen. Mit Git 1.7 git fetch origin <SHA1>
funktionierte nicht, wie von @artur berichtet; Sie müssen verwenden, git checkout <SHA1>
gefolgt von einem reset --hard
.
$ git clone $URL
$ cd $PROJECT_NAME
$ git reset --hard $SHA1
Um noch einmal zum letzten Commit zurückzukehren
$ git pull
--depth
für große Repos sehr wichtige verwenden kann. Diese Lösung erfordert das Ziehen aller Objekte und das Zurücksetzen auf eine frühere Version. Dies ist sehr zeitaufwändig und verschwendet die Netzwerkbandbreite.
Das Klonen eines Git-Repositorys klont treffend das gesamte Repository: Es gibt keine Möglichkeit, nur eine Revision zum Klonen auszuwählen. Sobald Sie jedoch ausgeführt haben, git clone
können Sie eine bestimmte Revision auschecken, indem Sie dies tun checkout <rev>
.
git clone
greift nach dem gesamten Repository. Sobald Sie es haben, können Sie eine bestimmte Revision auschecken.
git clone --single-branch ...
Um nur ein bestimmtes Commit für einen bestimmten Zweig oder ein bestimmtes Tag zu klonen, verwenden Sie:
git clone --depth=1 --branch NAME https://github.com/your/repo.git
Leider NAME
kann nur Zweigstellenname oder Tag-Name sein (kein SHA festschreiben).
Lassen Sie das --depth
Flag weg , um den gesamten Verlauf herunterzuladen, und überprüfen Sie dann den Zweig oder das Tag:
git clone --branch NAME https://github.com/your/repo.git
Dies funktioniert mit der neuesten Version von git (ich habe es mit der Version gemacht 2.18.0
).
Wenn Sie meinen, Sie möchten alles von Anfang an bis zu einem bestimmten Punkt abrufen, ist Charles Baileys Antwort perfekt. Wenn Sie das Gegenteil tun und eine Teilmenge des Verlaufs ab dem aktuellen Datum abrufen möchten, können Sie verwenden, git clone --depth [N]
wobei N die Anzahl der gewünschten Umdrehungen des Verlaufs ist. Jedoch:
--Tiefe
Erstellen Sie einen flachen Klon mit einem Verlauf, der auf die angegebene Anzahl von Revisionen gekürzt wurde. Ein flaches Repository weist eine Reihe von Einschränkungen auf (Sie können es nicht klonen oder abrufen oder von dort hineinschieben oder hineinschieben), ist jedoch ausreichend, wenn Sie nur an der jüngsten Geschichte eines großen Projekts mit einer langen Geschichte interessiert sind und dies möchten Fixes als Patches einsenden.
Nur um es zusammenzufassen (git v. 1.7.2.1):
git clone
wo du das Repo willst (bringt alles auf den neuesten Stand - ich weiß, nicht was gewünscht wird, wir kommen dorthin) git checkout <sha1 rev>
der Drehzahl, die Sie wollengit reset --hard
git checkout -b master
master
und wechselt zu diesem.
git reset --hard
? In den Dokumenten dazu heißt es: "Setzt den Index und den Arbeitsbaum zurück. Alle Änderungen an nachverfolgten Dateien im Arbeitsbaum seit <commit> [standardmäßig HEAD, das jetzt ist <sha1 rev>
] werden verworfen." Aber zu diesem Zeitpunkt haben wir seit dem Klonen keine Änderungen vorgenommen. Was ist also der Zweck? Schneidet es den aktuellen Zweig bei ab <sha1 rev>
?
TL; DR - Erstellen Sie einfach ein Tag im Quell-Repository für das Commit, zu dem Sie klonen möchten, und verwenden Sie das Tag im Befehl fetch. Sie können das Tag später aus dem Original-Repo löschen, um es zu bereinigen.
Nun, es ist 2014 und es sieht so aus, als ob Charles Baileys akzeptierte Antwort aus dem Jahr 2010 mittlerweile wirklich veraltet ist und die meisten (alle?) Der anderen Antworten beinhalten das Klonen, was viele Menschen zu vermeiden hoffen.
Mit der folgenden Lösung wird das erreicht, wonach das OP und viele andere suchen. Auf diese Weise können Sie eine Kopie eines Repositorys einschließlich des Verlaufs erstellen, jedoch nur bis zu einem bestimmten Commit.
Hier sind die Befehle, die ich mit git Version 2.1.2 verwendet habe, um ein lokales Repo (dh ein Repository in einem anderen Verzeichnis) bis zu einem bestimmten Punkt zu klonen:
# in the source repository, create a tag against the commit you want to check out
git tag -m "Temporary tag" tmptag <sha1>
# create a new directory and change into that directory
cd somewhere_else;mkdir newdir;cd newdir
# ...and create a new repository
git init
# add the source repository as a remote (this can be a URL or a directory)
git remote add origin /path/to/original/repo
# fetch the tag, which will include the entire repo and history up to that point
git fetch origin refs/tags/tmptag
# reset the head of the repository
git reset --hard FETCH_HEAD
# you can now change back to the original repository and remove the temporary tag
cd original_repo
git tag -d tmptag
Hoffentlich funktioniert diese Lösung noch einige Jahre! :-)
Sie können einfach verwenden git checkout <commit hash>
in dieser Reihenfolge
bash
git clone [URLTORepository]
git checkout [commithash]
Commit-Hash sieht folgendermaßen aus: "45ef55ac20ce2389c9180658fdba35f4a663d204"
Die Verwendung von 2 der oben genannten Antworten ( Wie klone ich ein Git-Repository mit einer bestimmten Revision / einem bestimmten Änderungssatz? Und Wie klone ich ein Git-Repository mit einer bestimmten Revision / einem bestimmten Änderungssatz? ) Hat mir geholfen, eine endgültige Antwort zu finden. Wenn Sie bis zu einem Punkt klonen möchten, muss dieser Punkt ein Tag / Zweig sein, nicht nur ein SHA, oder der FETCH_HEAD wird verwirrt. Wenn Sie nach dem Git-Abrufsatz einen Zweig- oder Tag-Namen verwenden, erhalten Sie eine Antwort. Wenn Sie einfach einen SHA-1 verwenden, erhalten Sie keine Antwort.
Folgendes habe ich getan: - Erstellen Sie einen voll funktionsfähigen Klon des vollständigen Repos aus dem tatsächlichen Ursprung
cd <path to create repo>
git clone git@<our gitlab server>:ui-developers/ui.git
Erstellen Sie dann an der interessanten Stelle eine lokale Niederlassung
git checkout 2050c8829c67f04b0db81e6247bb589c950afb14
git checkout -b origin_point
Erstellen Sie dann mein neues leeres Repo mit meiner lokalen Kopie als Ursprung
cd <path to create repo>
mkdir reduced-repo
cd reduced-repo
git init
git remote add local_copy <path to create repo>/ui
git fetch local_copy origin_point
Zu diesem Zeitpunkt erhielt ich diese Antwort. Ich stelle es fest, denn wenn Sie anstelle des obigen Zweigs einen SHA-1 verwenden, passiert nichts. Die Antwort bedeutet also, dass es funktioniert hat
/ var / www / html / ui-hacking $ git fetch local_copy origin_point remote: Objekte zählen: 45493, fertig. remote: Objekte komprimieren: 100% (15928/15928), fertig. Remote: Insgesamt 45493 (Delta 27508), wiederverwendet 45387 (Delta 27463) Empfangsobjekte: 100% (45493/45493), 53,64 MiB | 50,59 MiB / s, fertig. Auflösen von Deltas: 100% (27508/27508), erledigt. Aus / var / www / html / ui * branch origin_point -> FETCH_HEAD * [neuer Zweig] origin_point -> origin / origin_point
In meinem Fall musste ich das dann wieder auf Gitlab setzen, als neues Repo, also tat ich es
git remote add origin git@<our gitlab server>:ui-developers/new-ui.git
Was bedeutete, dass ich mein Repo vom origin_point aus neu erstellen konnte, indem ich git --git-dir=../ui/.git format-patch -k -1 --stdout <sha1> | git am -3 -k
Cherry Pick aus der Ferne verwendete und dann git push origin
das gesamte Los zurück in sein neues Zuhause hochlud .
Hoffe das hilft jemandem
git fetch local_copy origin_point
sich von JamesGs git fetch origin refs/tags/tmptag
?
git fetch local_copy origin_point
lassen Sie sich in einem Zustand mit einem leeren reduced-repo
Verzeichnis, nur ein enthält .git
. In dieser Anleitung fehlt noch etwas ...
Meine Version war eine Kombination aus akzeptierten und am besten bewerteten Antworten. Aber es ist ein bisschen anders, weil jeder SHA1 verwendet, aber niemand sagt Ihnen, wie Sie es bekommen
$ git init
$ git remote add <remote_url>
$ git fetch --all
Jetzt können Sie alle Zweige und Commits sehen
$ git branch -a
$ git log remotes/origin/master <-- or any other branch
Schließlich kennen Sie SHA1 des gewünschten Commits
git reset --hard <sha1>
Ich verwende dieses Snippet mit GNU make, um Revisions-Tags, Zweige oder Hashs zu schließen
Es wurde auf Git Version 2.17.1 getestet
${dir}:
mkdir -p ${@D}
git clone --recursive --depth 1 --branch ${revison} ${url} ${@} \
|| git clone --recursive --branch ${revison} ${url} ${@} \
|| git clone ${url} ${@}
cd ${@} && git reset --hard ${revison}
ls $@
git clone https://github.com/ORGANIZATION/repository.git
(Klonen Sie das Repository)
cd repository (navigate to the repository)
git fetch origin 2600f4f928773d79164964137d514b85400b09b2
git checkout FETCH_HEAD
# clone special tag/branch without history
git clone --branch=<tag/branch> --depth=1 <repository>
# clone special revision with minimal histories
git clone --branch <branch> <repository> --shallow-since=yyyy-MM-ddTHH:mm:ss # get the commit time
cd <dir>
git reset --hard <revision>
Sie können keine Revision ohne Verlauf erhalten, wenn sie nicht uploadpack.allowReachableSHA1InWant=true
auf der Serverseite festgelegt ist. Sie können jedoch ein Tag dafür erstellen und stattdessen das spezielle Tag klonen.
git clone -o <sha1-of-the-commit> <repository-url> <local-dir-name>
git
verwendet das Wort origin
anstelle von im Volksmund bekanntrevision
Es folgt ein Ausschnitt aus dem Handbuch $ git help clone
--origin <name>, -o <name>
Instead of using the remote name origin to keep track of the upstream repository, use <name>.
--depth=1
wird in der Antwort nicht erwähnt. Warum sollten Sie also sagen, dass diese Antwort funktioniert hat, wenn Sie weitere Dinge hinzugefügt haben, die hier nicht erwähnt werden? Ich bin froh, dass es für Sie geklappt hat, aber diese Antwort ist irreführend und beantwortet die Frage nicht einmal teilweise. Daher die Abstimmungen.
git clone <url> <local_dir_name>
einfach selbst aus. Der einzige Unterschied besteht darin, dass die Fernbedienung (gezeigt mit git remote
) anstelle des üblichen Namens "Ursprung" eine kryptische sha1-Sequenz genannt wird. Mit anderen Worten, das <sha1-of-the-commit>
in dieser Antwort erwähnte hat keinerlei Einfluss darauf, welche Revisionen vom Server abgerufen werden oder welcher Zweig ausgecheckt wird.
git clone -o 896066ee1cf4d653057dac4e952f49c96ad16fa7 https://github.com/torvalds/linux.git linux --depth=1
. Dies gibt mir eine Überarbeitung 8a28d674
und nicht, 896066ee
wie Sie und diese Antwort behaupten.
git clone -b 10.1 https://github.com/MariaDB/server.git --depth=1 mariadb-server-src