Есть ли способ получить только один конкретный коммит из удаленного репозитория Git, не клонируя его на моем ПК? Структура удаленного репо абсолютно такая же, как у меня, и поэтому никаких конфликтов не будет, но я понятия не имею, как это сделать, и я не хочу клонировать этот огромный репозиторий.
Я новичок в мерзавце, есть ли способ?
Ответы:
Начиная с Git версии 2.5+ (второй квартал 2015 года), получение одного коммита (без клонирования полного репо) действительно возможно.
См. Коммит 68ee628 от Fredrik Medley (
moroten
) , 21 мая 2015 г.(объединено с Junio C Hamano
gitster
- в коммите a9d3493 , 01 июня 2015 г.)Теперь у вас есть новый конфиг (на стороне сервера)
Если вы объедините эту конфигурацию на стороне сервера с поверхностным clone (
git fetch --depth=1
), вы можете запросить один коммит (см .t/t5516-fetch-push.sh
:Вы можете использовать
git cat-file
команду, чтобы увидеть, что фиксация была получена:Полная документация:
Git 2.6 (3 квартал 2015 года) улучшит эту модель.
Смотрите коммит 2bc31d1 , коммит cc118a6 (28 июля 2015 г.) Джеффа Кинга (
peff
) .(Слиты Junio C Hamano -
gitster
- в фиксации 824a0be , 19 Aug 2015)Git 2.7 (ноябрь / декабрь 2015) снова улучшится:
См. Коммит 948bfa2 , коммит 00b293e (05 ноября 2015 г.), коммит 78a766a , коммит 92cab49 , коммит 92cab49 , коммит 92cab49 (03 ноя 2015 г.), коммит 00b293e , коммит 00b293e (05 ноября 2015 г.) и коммит 92cab49 , коммит 92cab49 , коммит 92cab49 , совершить 92cab49 (03 ноября 2015 г.) Лукасом Флейшером (
lfos
) .Помогает: Эрик Саншайн (
sunshineco
) .(Слиты Джефф Кинг -
peff
- в фиксации dbba85e , 20 ноября 2015)Отсюда новая документация :
R .. упоминает в комментариях конфиг
uploadpack.allowAnySHA1InWant
, который позволяетupload-pack
принятьfetch
запрос, который запрашивает любой объект вообще. (По умолчаниюfalse
).Смотрите коммит f8edeaa (ноябрь 2016, Git v2.11.1) Дэвида "novalis" Тернера (
novalis
) :источник
uploadpack.allowAnySHA1InWant
без штрафа за вычисление достижимости (и вектор DoS).Вы клонируете только один раз, поэтому, если у вас уже есть клон удаленного репозитория, извлечение из него не загрузит все снова. Просто укажите, какую ветку вы хотите получить, или извлеките изменения и извлеките коммит, который вы хотите.
Выборка из нового хранилища очень дешевая в полосе пропускания, поскольку она загружает только те изменения, которых у вас нет. Думайте с точки зрения Git, делающего правильные вещи с минимальной нагрузкой.
Git хранит все в
.git
папке. Коммит не может быть извлечен и сохранен изолированно, ему нужны все его предки. Они взаимосвязаны .Однако, чтобы уменьшить размер загрузки, вы можете попросить git выбрать только объекты, связанные с определенной веткой или коммитом:
Это позволит загрузить только коммиты, содержащиеся в удаленной ветке
branch
(и только те, которые вы пропустили) , и сохранить их вorigin/branch
. Затем вы можете объединить или оформить заказ.Вы также можете указать только коммит SHA1:
Это загрузит только фиксацию указанного SHA-1 96de5297df870 (и его предков, которые вы пропустили) и сохранит ее как (несуществующую) удаленную ветку
origin/foo-commit
.источник
2.7.4-0ubuntu1.3
. Однако при использовании2.16.2-0ppa1~ubuntu16.04.1
из PPA git-core это работает как надо. Похоже, ошибка, которая была исправлена. Не удалось найти ссылку на это с помощью быстрого поиска. Если кто-то может подсказать мне это, я бы хотел, чтобы это исправление было перенесено.Я сделал натяжение моего репозитория git:
Позволив git вытащить весь код для ветки, а затем я сделал сброс к коммиту, который меня заинтересовал.
git reset --hard <commit-hash>
Надеюсь это поможет.
источник
git reset --hard
, когда они используются совместно в обобщенных решениях, могут привести людей в ловушки, где они теряют данные (или, в данном случае: в состоянии, когда получение их данных нетривиально).Вы можете просто получить один коммит удаленного репо с
где,
<repo>
может быть именем удаленного репо (напримерorigin
) или даже URL удаленного репо (напримерhttps://git.foo.com/myrepo.git
)<commit>
может быть SHA1 коммитнапример
После того, как вы получили коммит (и пропавших предков), вы можете просто оформить его с помощью
Обратите внимание, что это приведет вас в состояние «оторванная голова».
источник
fetch
конкретную версию, как вы делаете, git завершается с ошибкой с кодом ошибки 1 и без вывода. Это было то, что раньше работало в прошлых версиях? (Я v2.0.2.)fetch
, хотя в этом случае я не уверен, какой смысл использовать.git checkout FETCH_HEAD
помогает.--depth=1
)!Вы можете просто получить удаленное репо с:
где,
<repo>
может быть именем удаленного репо (напримерorigin
) или даже URL удаленного репо (напримерhttps://git.foo.com/myrepo.git
)например:
После того, как вы получили репо, вы можете объединить нужные коммиты (поскольку вопрос заключается в получении одного коммита, вместо слияния вы можете использовать cherry-pick, чтобы выбрать только один коммит):
<commit>
может быть SHA1 коммитнапример:
или
Если это последний коммит, который вы хотите объединить, вы также можете использовать переменную FETCH_HEAD:
источник
git config set uploadpack.allowReachableSHA1InWant
?Это работает лучше всего:
назовите "temp" как хотите ... эта ветка может быть осиротевшей
источник
Наконец я нашел способ клонировать конкретный коммит с помощью git cherry-pick . Предполагая, что у вас нет локального хранилища и вы извлекаете конкретный коммит из удаленного,
1) создать пустой репозиторий в локальном и git init
2) git remote add origin " url-of-repository" "
3) происхождение git fetch [это не переместит ваши файлы в ваше локальное рабочее пространство, если вы не объединитесь]
4) git cherry-pick " Enter-long-commit-hash-that-you-need" "
Готово. Таким образом, у вас будут только файлы из этого конкретного коммита в вашем локальном компьютере.
Введите длиной фиксации-хэш:
Вы можете получить это используя -> git log --pretty = oneline
источник
Я думаю, что 'git ls-remote' ( http://git-scm.com/docs/git-ls-remote ) должен делать то, что вы хотите. Без силы извлекать или тянуть.
источник
Если запрошенный коммит находится в запросах на удаление удаленного репо, вы можете получить его по его ID:
источник