Есть ли способ получить только один конкретный коммит из удаленного Git-репозитория, не клонируя его на моем компьютере? Структура удаленного репозитория абсолютно такая же, как у меня, и, следовательно, не будет никаких конфликтов, но я понятия не имею, как это сделать, и я не хочу клонировать этот огромный репозиторий.
Я новичок в git, есть ли какой-нибудь способ?
Начиная с версий 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
Если вам скрывать иерархию ссылок с помощью перевода.hideRefs
config, то нет никакого способа, чтобы переопределить позже, что конфиг, чтобы "показать" это. Данный патч реализует на "негативный" и скрывать что вызывает матчей, чтобы сразу быть отмечен как видимый, даже если следующий матч будет скрывать. Мы заботимся, чтобы применить матчи в обратном порядке от того, как они подаются нам по конфигурации машины, а что позволяет нашим обычным "в последний выигрывает" в конфиге приоритет работы (и записи в.в 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-запросов, в конечном итоге направлена на эти различные сервера.
Вы клонируете только один раз, поэтому, если у вас уже есть клон удаленного репозитория, извлечение из него не приведет к повторной загрузке. Просто укажите, какую ветку вы хотите извлечь, или получите изменения и проверьте нужный вам коммит.
Вытаскивание из нового репозитория очень дешево по пропускной способности, так как оно будет загружать только те изменения, которых у вас нет. Думайте в терминах того, что 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
.
Я сделал pull в своем git-репо:
git pull --rebase <repo> <branch>
Позволив git'у подтянуть весь код для ветки, а затем я сделал сброс на интересующий меня коммит.
git reset --hard <commit-hash>
.
Надеюсь, это поможет.
Вы можете просто получить один коммит удаленного репозитория с помощью функции
git fetch <repo> <commit>
где,
<repo>
может быть именем удаленного репо (например, origin
) или даже URL удаленного репо (например, https://git.foo.com/myrepo.git
)<commit>
может быть SHA1 коммитанапример
git fetch https://git.foo.com/myrepo.git 0a071603d87e0b89738599c160583a19a6d95545
после получения коммита (и недостающих предков) вы можете просто проверить его с помощью команды
git checkout FETCH_HEAD
Обратите внимание, что это приведёт вас в состояние "отсоединённой головы".
Вы можете просто получить удаленный РЕПО с:
git fetch <repo>
где,
<РЕПО>
может быть удаленный РЕПО название (например, "происхождение") или даже удаленный РЕПО URL-адрес (напр. https://git.foo.com/myrepo.git
)например:
git fetch https://git.foo.com/myrepo.git
после того, как вы скачали РЕПО может слить коммиты, которые вы хотите (поскольку речь идет о получить один коммит, а не слиянием, вы можете использовать вишни-выбрать только один коммит):
git merge <commit>
<фиксации>
может быть SHA1 для фиксациинапример:
git cherry-pick 0a071603d87e0b89738599c160583a19a6d95545
или
git merge 0a071603d87e0b89738599c160583a19a6d95545
если это последний коммит, который вы хотите объединить, вы также можете использовать FETCH_HEAD переменной :
git cherry-pick (or merge) FETCH_HEAD
Наконец-то я нашел способ клонировать определенный коммит, используя мерзавец вишня-выбор. Предполагая, что вы Дон'Т есть какие-либо репозитории в местных и вы тянете определенный коммит из глубинки,
создать пустой репозиторий в локальной и ГИТ инит
в Git дистанционного добавить происхождения и"URL-адрес-от-хранилище"и
ГИТ выборки происхождения [это не переместить файлы в локальной рабочей области, если вы сливаете]
мерзавец вишня-выбор и"ввод-долго фиксации-хэш-что-вам-нужнои"
Сделано.Таким образом, вы будете иметь только файлы из этого определенный коммит в локальный.
Вы можете сделать это с помощью -> войти в Git --довольно=короткая
Это работает лучше всего:
git fetch origin specific_commit
git checkout -b temp FETCH_HEAD
именем "Темп" и все, что вы хотите...эта ветка может быть сиротами
Я думаю, что 'ГИТ ЛС-пульт дистанционного' ( http://git-scm.com/docs/git-ls-remote ) должны делать то, что вы хотите. Без силы fetch или вытащить.
Если требуемая фиксация на запросы удаленного РЕПО, вы можете получить его по 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