Как загрузить конкретную фиксацию git из репозитория?
У меня нет локальной копии кода /etc, я просто хочу загрузить отдельный конкретный коммит git, чтобы я мог его просматривать. У меня есть URL-адрес репозитория git:
git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6.git
и хеш фиксации:
ee9c5cfad29c8a13199962614b9b16f1c4137ac9
Как загрузить эту фиксацию с помощью git (я не хочу, чтобы весь репо, только одно исправление)? Я прочитал man-страницы для git -pull и git -cherry-pick и пошатнулся командами без везения.
Клонирование репо действительно не является опцией, поскольку некоторые из хранилищ ядра чрезвычайно велики и медленны для загрузки (часы).
Ответы
Ответ 1
Это казалось бы невозможным. Согласно Обсуждение на kernel.org, протокол будет разрешать только named refs быть извлеченным. Если вы не хотите загружать снимок с веб-сайта git, вам придется клонировать все репо.
(Вы можете прочитать руководства для git-fetch и git-ls-remote.)
Ответ 2
В общем случае вы можете сделать это, используя флаг --remote
для git archive
, например:
$ git archive -o repo.tar --remote=<repo url> <commit id>
Итак, в вашем примере вы должны использовать:
$ git archive -o repo.tar --remote=git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6.git ee9c5cfad29c8a13199962614b9b16f1c4137ac9
Это даст вам состояние репо в этот момент времени. Обратите внимание, что вы не получите полное репо, так что вы не можете фактически взаимодействовать с репозиторией upstream с тем, что вы загрузили.
Однако использование git archive
удаленно должно быть включено на стороне сервера, и оно не находится на сервере Linux Git. Однако вы можете взять копию, используя URL-адрес формы http://git.kernel.org/?p=<path to repo>;a=snapshot;h=<commit id>;sf=tgz
. Поэтому для вашего репо вы можете использовать, скажем, wget или curl, чтобы захватить файл, используя этот URL.
Ответ 3
Я знаю, что это работает, когда у вас есть клон репо (или подобное репо).
git fetch git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6.git
git cherry-pick ee9c5cfad29c8a13199962614b9b16f1c4137ac9
Fetch загружает удаленные ссылки (но не все репо, я не думаю), чтобы вы могли ссылаться на них с другими командами. Затем вы выбираете червь, который один совершает, и пытается применить diff к вашему локальному дереву.
Я не пробовал его без репозитория git локально, но я попробовал его на repos, которые не являются вилками eachother. вы можете получить конфликты слияния, но вы можете очистить их вручную.
Ответ 4
git show COMMITID
Но вы должны клонировать репо. Похоже, это не так. Но вы можете сделать неглубокий клон, используя -depth arg.
Кроме того, был найден хороший пост SO, который более подробно охватывает эту тему Просмотр и отображение файлов в репозитории git без клонирования
Ответ 5
У меня была такая же потребность.
Мне нужно загрузить патч определенного коммита, который мне нужно применить к другой ветке.
Я использовал: git format-patch sha-id
Просто укажите sha-id
, который просто старше требуемого коммита.
Он даст файлы .patch
, соответствующие всем коммитам.
Ответ 6
Сегодня я столкнулся с этой проблемой и нашел способ загрузить архивы для определенного коммита. Если вы перейдете в репозиторий на git.kernel.org, внизу появится раздел клонирования. Нижний url - это зеркало google git. Вы сможете скачать архивы для определенных коммитов отсюда.
Ответ 7
Есть способ сделать это:
git show ee9c5cfad29c8a13199962614b9b16f1c4137ac9 > myCommittedCode.txt
Ответ 8
В этом случае, если все, что вам нужно, это diff, вы можете загрузить его из веб-интерфейса для репо сервера в этом URL-адресе:
http://git.kernel.org/?p=linux/kernel/git/davem/net-2.6.git;a=commitdiff_plain;h=ee9c5cfad29c8a13199962614b9b16f1c4137ac9
Вы можете играть с URL-адресом, чтобы получить другие фиксации.