Получение конкретного коммита из удаленного репозитория Git

Есть ли способ получить только один конкретный коммит из удаленного Git-репозитория, не клонируя его на моем компьютере? Структура удаленного репозитория абсолютно такая же, как у меня, и, следовательно, не будет никаких конфликтов, но я понятия не имею, как это сделать, и я не хочу клонировать этот огромный репозиторий.

Я новичок в git, есть ли какой-нибудь способ?

Комментарии к вопросу (8)
Решение

Начиная с версий Git 2.5+ (2 квартал 2015), извлечение одного коммита (без клонирования полного РЕПО) на самом деле возможно. См. совершить 68ee628 по Фредрик Попурри (moroten), 21 мая 2015 года. <суп>(объединяются по Джунио с Hamano -- gitster -- в совершить a9d3493, 01 июн 2015)</SUP и ГТ; Теперь у вас есть новый конфиг (на стороне сервера)

uploadpack.allowReachableSHA1InWant

позволят загрузить-пакетпринимает ответ на запрос на выборку, который запрашивает объект, который достижим из любой Реф совет. Однако, обратите внимание, что расчет объекта достижимости является вычислительно дорогой. По умолчанию значениеfalse. Если вы объедините это серверные конфигурации с мелкий клон ([ГИТ выборки --глубина=1][1]), Вы можете задать для отдельной фиксации (см. [t/t5516-fetch-push.sh`][2]:

git fetch --depth=1 ../testrepo/.git $SHA1

Вы можете использовать команду `git в кота-файл, чтобы увидеть, что фиксация была извлечена:

git cat-file commit $SHA1

"в ГИТ отправить-упаковать в" блюда "в ГИТ принести" могут быть сказал, чтобы служить совершает, что не на кончике любой Реф, пока они добраться из Реф, с uploadpack.allowReachableSHA1InWant` переменной конфигурации.

Полная документация:

`загрузить-пакет: по желанию выборки позволит добраться в SHA1

С uploadpack.allowReachableSHA1InWantконфигурация набора параметров на стороне сервера, "в ГИТ выборки" могут сделать запрос на "Хочу" по линии, которая называет объект, который не афишируется (вероятно, были получены из полосы или из подмодуля указатель). Доступен только объекты из советов филиала, т. е. Союза рекламируется отделения и филиалы скрытые передачи.hideRefs, будут обработаны. Обратите внимание, что стоимость того, чтобы вернуться к истории, чтобы проверить достижимость. эта функция может быть использована при получении содержание определенной фиксации, для чего и SHA1 известно, без необходимости клонирования весь репозиторий, особенно если неглубокая выборка используется. полезные дела, например

  • хранилищ, содержащих большие файлы в истории,
  • извлечения только необходимых данных для подмодуль проверки,
  • при совместном использовании алгоритма SHA1, не сказав, какие именно ветви оно принадлежит и в Геррит, если вы думаете с точки зрения совершает вместо цифры меняются. (Дело Геррит уже решена через allowTipSHA1InWant, так как каждое изменение Геррит имеет Реф.)

    ГИТ 2.6 (3 квартал 2015) улучшит эту модель. См. совершить 2bc31d1, совершают cc118a6 (28 июля 2015) при помощи Джефф Кинг (peff). <суп>(объединяются по Джунио с Hamano -- gitster -- в совершить 824a0be, 19 августа 2015 года)</SUP и ГТ;

    рефы: поддержка отрицательный передачи.hideRefs

    Если вам скрывать иерархию ссылок с помощью перевода.hideRefsconfig, то нет никакого способа, чтобы переопределить позже, что конфиг, чтобы "показать" это. Данный патч реализует на "негативный" и скрывать что вызывает матчей, чтобы сразу быть отмечен как видимый, даже если следующий матч будет скрывать. Мы заботимся, чтобы применить матчи в обратном порядке от того, как они подаются нам по конфигурации машины, а что позволяет нашим обычным "в последний выигрывает" в конфиге приоритет работы (и записи в.в git/config файл, например, будет переопределитьфайл/etc/gitconfig хранит настройки`). так что вы можете сейчас сделать:

git config --system transfer.hideRefs refs/secret
git config transfer.hideRefs '!refs/secret/not-so-secret'

, Чтобы скрыть ссылки/секрет во всех РЕПО, за исключением одного общественного бит в одном конкретном РЕПО.

ГИТ 2.7 (Ноябрь/Декабрь 2015) снова улучшить: См. совершить 948bfa2, совершают 00b293e (05 ноября 2015), совершают 78a766a, совершают 92cab49, совершают 92cab49, совершают 92cab49 (03 ноября 2015), совершают 00b293e, совершают 00b293e (05 ноября 2015), и совершать 92cab49, совершают 92cab49, совершить 92cab49, совершают 92cab49 (03 ноября 2015 года) Лукас Фляйшер (генератора). Помог-от: Эрика Солнце (sunshineco). <суп>(объединяются по Джефф Кинг -- peff -- в совершить dbba85e, 20 ноября 2015)</SUP и ГТ;

config.txt: документ семантику hideRefs с пространствами имен

сейчас нет четкого определения, как передача.hideRefs должны вести себя, когда пространство имен-это набор. Объясните, что матч hideRefs-нибудь раздели имена в этом случае. Это как узоры hideRefs сейчас обращаться в получаем пакет.

hideRefs: добавить поддержку для соответствующего полному рефов

В дополнение к комбинационной раздели рефов, можно теперь добавить узоры hideRefs, что полный (жирный) Реф сопоставляется. Различать раздели и полный играм, эти новые модели должны быть с префиксом символ'^' ( ^ ). Отсюда [новые документы][3]:

transfer.hideRefs:

если пространство имен используется, то префикс удаляется из каждой ссылки прежде чем она сопоставляется передачи.узоры hiderefs. Например, еслиРЭС/руководители/мастеруказанному в передаче.hideRefs и в текущее пространство именфу, торефы/пространства имен с именем/foo/РЭС/руководители/мастер опущен от рекламы, но РЭС/руководители/Мастер и рефы/пространства/бар/РЭС/руководители/мастер по-прежнему рекламируется в качестве так называемых "имеют" по линии. Для того, чтобы соответствовать рефов до зачистки, добавить ^ перед имя Реф. Если вы совмещаете ! и ^, ! должен быть задан первым.

Р.. говорится в комментарии uploadpack файл config .allowAnySHA1InWant, которая позволяет загрузить пакетпринятьпринестипросьбам для любого объекта вообще. (По умолчанию значение false). См. [совершить f8edeaa][7] (ноября. 2016, ГИТ В2.11.1) по [Давид ад "приглашает на" Тернер (Новалис`)]8:

`загрузить-пакет: по желанию разрешить получение любого алгоритма SHA1

Это кажется немного глупо делать чек reachabilty в том случае, когда мы доверие пользователей получить доступ к абсолютно все в репозитории. кроме того, он'ы кратии в распределенной системе-возможно, один сервер рекламирует Реф, но еще и с силой-давить на этот Реф и, возможно, два HTTP-запросов, в конечном итоге направлена на эти различные сервера.

Комментарии (9)

Вы клонируете только один раз, поэтому, если у вас уже есть клон удаленного репозитория, извлечение из него не приведет к повторной загрузке. Просто укажите, какую ветку вы хотите извлечь, или получите изменения и проверьте нужный вам коммит.

Вытаскивание из нового репозитория очень дешево по пропускной способности, так как оно будет загружать только те изменения, которых у вас нет. Думайте в терминах того, что Git делает правильные вещи с минимальной нагрузкой.

Git хранит все в папке .git. Коммит не может быть получен и сохранен изолированно, ему нужны все его предки. Они взаимосвязаны.


Однако, чтобы уменьшить размер загрузки, вы можете попросить git получить только объекты, относящиеся к определенной ветке или коммиту:

git fetch origin refs/heads/branch:refs/remotes/origin/branch

Это загрузит только коммиты, содержащиеся в удалённой ветке branch (и только те, которые вы пропустили), и сохранит их в origin/branch. Затем вы можете выполнить слияние или выгрузку.

Вы также можете указать только SHA1 коммит:

git fetch origin 96de5297df870:refs/remotes/origin/foo-commit

Это загрузит только коммит указанного SHA-1 96de5297df870 (и его предков, которые вы пропустите), и сохранит его как (несуществующую) удалённую ветку origin/foo-commit.

Комментарии (9)

Я сделал pull в своем git-репо:

git pull --rebase  

Позволив git'у подтянуть весь код для ветки, а затем я сделал сброс на интересующий меня коммит.

git reset --hard.

Надеюсь, это поможет.

Комментарии (3)

Вы можете просто получить один коммит удаленного репозитория с помощью функции

git fetch  

где,

  • `может быть именем удаленного репо (например,origin) или даже URL удаленного репо (например,https://git.foo.com/myrepo.git`)
  • `` может быть SHA1 коммита

например

git fetch https://git.foo.com/myrepo.git 0a071603d87e0b89738599c160583a19a6d95545

после получения коммита (и недостающих предков) вы можете просто проверить его с помощью команды

git checkout FETCH_HEAD

Обратите внимание, что это приведёт вас в состояние "отсоединённой головы".

Комментарии (9)

Вы можете просто получить удаленный РЕПО с:

git fetch 

где,

  • в <РЕПО> может быть удаленный РЕПО название (например, "происхождение") или даже удаленный РЕПО URL-адрес (напр. https://git.foo.com/myrepo.git)

например:

git fetch https://git.foo.com/myrepo.git 

после того, как вы скачали РЕПО может слить коммиты, которые вы хотите (поскольку речь идет о получить один коммит, а не слиянием, вы можете использовать вишни-выбрать только один коммит):

git merge 
  • в <фиксации> может быть SHA1 для фиксации

например:

git cherry-pick 0a071603d87e0b89738599c160583a19a6d95545

или

git merge 0a071603d87e0b89738599c160583a19a6d95545

если это последний коммит, который вы хотите объединить, вы также можете использовать FETCH_HEAD переменной :

git cherry-pick (or merge) FETCH_HEAD
Комментарии (3)

Наконец-то я нашел способ клонировать определенный коммит, используя мерзавец вишня-выбор. Предполагая, что вы Дон'Т есть какие-либо репозитории в местных и вы тянете определенный коммит из глубинки,

  1. создать пустой репозиторий в локальной и ГИТ инит

  2. в Git дистанционного добавить происхождения и"URL-адрес-от-хранилище

  3. ГИТ выборки происхождения [это не переместить файлы в локальной рабочей области, если вы сливаете]

  4. мерзавец вишня-выбор и"ввод-долго фиксации-хэш-что-вам-нужнои"

Сделано.Таким образом, вы будете иметь только файлы из этого определенный коммит в локальный.

Введите-долго фиксации-хэш:

Вы можете сделать это с помощью -> войти в Git --довольно=короткая

Комментарии (0)

Это работает лучше всего:

git fetch origin specific_commit
git checkout -b temp FETCH_HEAD

именем "Темп" и все, что вы хотите...эта ветка может быть сиротами

Комментарии (1)

Я думаю, что 'ГИТ ЛС-пульт дистанционного' ( http://git-scm.com/docs/git-ls-remote ) должны делать то, что вы хотите. Без силы fetch или вытащить.

Комментарии (0)

Если требуемая фиксация на запросы удаленного РЕПО, вы можете получить его по ID:

# Add the remote repo path, let's call it 'upstream':
git remote add upstream https://github.com/repo/project.git

# checkout the pull ID, for example ID '60':
git fetch upstream pull/60/head && git checkout FETCH_HEAD
Комментарии (0)