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
Author: Tshepang, 2010-08-16

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
 146
Author: CB Bailey,
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
 687
Author: Vaibhav Bajpai,
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>.

 49
Author: ,
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 20:49:43

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.

 28
Author: Walter Mundt,
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):

  1. zrób zwykły git clone gdzie chcesz repo (dostaje wszystko na bieżąco-wiem, nie to, co jest pożądane, dojdziemy tam)
  2. git checkout <sha1 rev> of the rev you want
  3. git reset --hard
  4. git checkout -b master
 25
Author: phill,
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! :-)

 17
Author: JamesG,
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"

 4
Author: M.Othman,
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

 2
Author: sibaz,
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>
 2
Author: vladkras,
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

 1
Author: NEOJPK,
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

 1
Author: JeffDropsIT,
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).

 0
Author: Peter Kovac,
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>.
 -5
Author: hell_ical_vortex,
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