Jak sklonować repozytorium git z określonym zestawem zmian?
Jak mogę sklonować repozytorium git z konkretną rewizją, co zwykle robię w Mercurial:
hg clone -r 3 /path/to/repository
13 answers
UPDATE 2 Since Git 2.5.0 funkcja opisana poniżej może być włączona po stronie serwera ze zmienną konfiguracyjnąuploadpack.allowReachableSHA1InWant
, tutaj żądanie funkcji GitHub i zatwierdzanie funkcji GitHub. Zauważ, że niektóre serwery Git domyślnie aktywują tę opcję, np. Bitbucket Server włączył ją od w wersji 5.5 + . Zobacz tę odpowiedź na Stackexchange , aby dowiedzieć się, jak aktywować konfigurację opcja.
UPDATE 1 dla wersji Git 1.7 < v < 2.5
Użyj git clone i GIT reset, jak opisano w Vaibhav Bajpai ' s answer
Jeśli nie chcesz pobrać pełnego repozytorium, prawdopodobnie nie powinieneś używać clone
. Zawsze możesz użyć fetch, aby wybrać gałąź, którą chcesz pobrać. Nie jestem ekspertem od hg więc nie znam szczegółów -r
ale w git można coś takiego zrobić.
# 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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-21 12:47:00
$ git clone $URL
$ cd $PROJECT_NAME
$ git reset --hard $SHA1
Aby wrócić do najnowszego commita
$ git pull
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-16 18:11:06
Klonowanie repozytorium git, trafnie, klonuje całe repozytorium: nie ma sposobu, aby wybrać tylko jedną wersję do klonowania. Jednak gdy wykonasz git clone
, możesz wykonać konkretną rewizję wykonując checkout <rev>
.
Jeśli masz na myśli, że chcesz pobrać wszystko od początku do konkretnego punktu, odpowiedź Charlesa Baileya jest idealna. Jeśli chcesz zrobić odwrotnie i pobrać podzbiór historii od bieżącej daty, Możesz użyć git clone --depth [N]
gdzie n jest liczbą obrotów historii, którą chcesz. Jednakże:
--depth
Utwórz płytki klon z historią skróconą do określonej liczby wersji. Płytkie repozytorium ma wiele ograniczeń (nie można z niego klonować ani pobierać, ani pchać z ani do niego), ale jest odpowiedni, jeśli interesuje Cię Tylko najnowsza Historia dużego projektu o długiej historii i chciałbyś wysyłać poprawki jako łatki.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-15 22:45:42
Podsumowując (git V. 1.7.2.1):
- zrób zwykły
git clone
gdzie chcesz repo (dostaje wszystko na bieżąco-wiem, nie to, co jest pożądane, dojdziemy tam) -
git checkout <sha1 rev>
of the rev you want git reset --hard
git checkout -b master
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-03 10:48:43
TL; DR-po prostu utwórz znacznik w repozytorium źródłowym przeciwko zatwierdzeniu, które chcesz sklonować i użyj znacznika w Komendzie fetch. Możesz usunąć znacznik z oryginalnego repo później, aby oczyścić.
Cóż, jego 2014 i wygląda na to, że przyjęta odpowiedź Charlesa Baileya z 2010 roku jest już dobrze i naprawdę przestarzała, a większość (wszystkie?) z pozostałych odpowiedzi wiąże się klonowanie, którego wiele osób ma nadzieję uniknąć.
Poniższe rozwiązanie pozwala osiągnąć to, czym jest OP i wiele innych Szukam, czyli sposób na stworzenie kopii repozytorium, w tym historii, ale tylko do określonego commita.
Oto polecenia, których użyłem z Gitem w wersji 2.1.2 do sklonowania lokalnego repo (np. repozytorium w innym katalogu) do pewnego punktu:
# 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
Miejmy nadzieję, że to rozwiązanie będzie działać jeszcze przez kilka lat! :-)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-19 00:33:33
Możesz użyć po prostu git checkout <commit hash>
W tej sekwencji
bash
git clone [URLTORepository]
git checkout [commithash]
Commit hash wygląda tak: "45ef55ac20ce2389c9180658fdba35f4a663d204"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-20 17:55:26
Użycie 2 z powyższych odpowiedzi (Jak sklonować repozytorium git z określonym zestawem zmian? i jak sklonować repozytorium git z określonym zestawem zmian?)
Pomógł mi wymyślić definicję. Jeśli chcesz sklonować do pewnego punktu, to ten punkt musi być tagiem / gałęzią, a nie tylko SHA lub fetch_head się myli. Po ustawieniu git fetch, jeśli użyjesz nazwy gałęzi lub tagu, otrzymasz odpowiedź, jeśli po prostu użyjesz SHA-1, otrzymasz odpowiedź not.
Oto co zrobiłem:-
tworzenie pełnego działającego klonu pełnego repo, z rzeczywistego źródła
cd <path to create repo>
git clone git@<our gitlab server>:ui-developers/ui.git
Następnie utwórz lokalną gałąź, w miejscu, które jest interesujące
git checkout 2050c8829c67f04b0db81e6247bb589c950afb14
git checkout -b origin_point
Następnie Utwórz moje nowe puste repo, z moją lokalną kopią jako jej źródłem
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
W tym momencie dostałem taką odpowiedź. Zauważam to, ponieważ jeśli użyjesz SHA - 1 zamiast gałęzi powyżej, nic się nie dzieje, więc odpowiedź oznacza, że zadziałało
/var/www/html/ui-hacking$ git fetch local_copy origin_point remote: Counting objects: 45493, done. remote: Compressing objects: 100% (15928/15928), done. remote: Total 45493 (delta 27508), reused 45387 (delta 27463) Receiving objects: 100% (45493/45493), 53.64 MiB | 50.59 MiB/s, done. Resolving deltas: 100% (27508/27508), done. From /var/www/html/ui * branch origin_point -> FETCH_HEAD * [new branch] origin_point -> origin/origin_point
Teraz w moim przypadku, musiałem umieścić to z powrotem na gitlab, jako fresh repo so I did
git remote add origin git@<our gitlab server>:ui-developers/new-ui.git
Co oznaczało, że mogłem odbudować mój repo z origin_point używając git --git-dir=../ui/.git format-patch -k -1 --stdout <sha1> | git am -3 -k
, aby zdalnie wybrać cherry, a następnie użyć git push origin
, aby przesłać całość z powrotem do nowego domu.
Hope that helps someone
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:40
Moja wersja była kombinacją zaakceptowanych i najbardziej upvoted odpowiedzi. Ale jest trochę inaczej, ponieważ każdy używa SHA1, ale nikt nie mówi ci, jak go zdobyć
$ git init
$ git remote add <remote_url>
$ git fetch --all
Teraz możesz zobaczyć wszystkie gałęzie i commity
$ git branch -a
$ git log remotes/origin/master <-- or any other branch
W końcu znasz SHA1 z desired commit
git reset --hard <sha1>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-24 05:50:27
To proste. Musisz tylko ustawić upstream dla bieżącej gałęzi
$ git clone repo
$ git checkout -b newbranch
$ git branch --set-upstream-to=origin/branch newbranch
$ git pull
To wszystko
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-20 08:10:37
git clone https://github.com/ORGANIZATION/repository.git
(klonowanie repozytorium)
cd repository (navigate to the repository)
git fetch origin 2600f4f928773d79164964137d514b85400b09b2
git checkout FETCH_HEAD
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-10 06:13:16
Aby sklonować tylko jeden konkretny commit na konkretnej gałęzi lub tagu:
git clone --depth=1 --branch NAME https://github.com/your/repo.git
Niestety, NAME
może być tylko nazwą gałęzi lub tagiem (nie commit SHA).
Pomiń flagę --depth
, Aby pobrać całą historię, a następnie sprawdzić tę gałąź lub tag:
git clone --branch NAME https://github.com/your/repo.git
To działa z najnowszą wersją Gita(zrobiłem to z wersją 2.18.0
).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-09 16:16:35
git clone -o <sha1-of-the-commit> <repository-url> <local-dir-name>
git
używa słowa origin
zamiast popularnego revision
Poniżej znajduje się fragment instrukcji $ git help clone
--origin <name>, -o <name>
Instead of using the remote name origin to keep track of the upstream repository, use <name>.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-06 08:02:01