Как редко получить только один файл из репозитория git? - PullRequest
395 голосов
/ 18 марта 2010

Как мне оформить заказ на один файл из репозитория git?

Ответы [ 21 ]

238 голосов
/ 18 марта 2010

Изначально я упоминал в 2012 году git archive (см. Джаред Форсайт ответ и Роберт Найт ответ ), начиная с git1.7.9.5 (март 2012 г.) , Пол Браннан * ответ :

git archive --format=tar --remote=origin HEAD:path/to/directory -- filename | tar -O -xf -

Но: в 2013 году это было невозможно для удаленных https://github.com URL .
Смотрите старую страницу " Можно ли заархивировать репозиторий? "

На текущей (2018 г.) странице " Об архивировании контента и данных на GitHub " рекомендуется использовать сторонние службы, такие как GHTorrent или GH Archive .


Так что вы также можете иметь дело с локальными копиями / клонами:

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

git --no-pager --git-dir /path/to/bar/repo.git show branch:path/to/file >file

Или вы должны сначала клонировать репо, то есть получить полную историю: - в репозитории .git - в рабочем дереве.

  • Но затем вы можете сделать разреженную проверку (если вы используете Git1.7 +),
    • включить опцию разреженной проверки (git config core.sparsecheckout true)
    • добавление того, что вы хотите видеть в .git/info/sparse-checkout файле
    • перечитывает рабочее дерево, чтобы отобразить только то, что вам нужно
178 голосов
/ 18 марта 2010

Сначала клонируйте репо с помощью параметра -n, который подавляет извлечение по умолчанию всех файлов, и параметра --depth 1, что означает, что он получает только самую последнюю версию каждого файла

git clone -n git://path/to/the_repo.git --depth 1

Тогда проверьте только тот файл, который вам нужен, вот так:

cd the_repo
git checkout HEAD name_of_file
100 голосов
/ 27 июня 2012

Если у вас уже есть копия git-репо, вы всегда можете извлечь версию файла, используя git log, чтобы узнать хэш-идентификатор (например, 3cdc61015724f9965575ba954c8cd4232c8b42e4), а затем просто наберите:

git checkout hash-id path-to-file

Вот фактический пример:

git checkout 3cdc61015724f9965575ba954c8cd4232c8b42e4 /var/www/css/page.css
48 голосов
/ 08 февраля 2013

Обычно невозможно скачать только один файл из git, не загружая весь репозиторий, как предложено в первом ответе. Это потому, что Git хранит файлы не так, как вы думаете (как это делают CVS / SVN), а генерирует их на основе всей истории проекта.

Но есть определенные обходные пути для конкретных случаев. Смотрите ниже:

GitHub

Если этот файл находится на github.com, попробуйте, например ,::1009*

wget https://raw.githubusercontent.com/user/project/master/README

GitWeb

Если вы используете Git на сервере - GitWeb , то вы можете попробовать в качестве примера (изменить его на правильный путь):

wget "http://example.com/gitweb/?p=example;a=blob_plain;f=README.txt;hb=HEAD"

GitWeb на drupalcode.org

Пример: * * тысяча двадцать-пять

wget "http://drupalcode.org/project/ads.git/blob_plain/refs/heads/master:/README.md"

googlesource.com

Существует недокументированная функция, которая позволяет загружать версии необработанных файлов в кодировке base64:

curl "https://chromium.googlesource.com/chromium/src/net/+/master/http/transport_security_state_static.json?format=TEXT" | base64 --decode

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

Если он не использует какой-либо веб-интерфейс, вы можете отправить свой код во внешние службы, такие как GitHub , Bitbucket , и т. Д. . и использовать его как зеркало.

Если у вас не установлена ​​wget, попробуйте curl -O (url) в качестве альтернативы.

38 голосов
/ 30 мая 2012

git checkout branch_or_version - путь / файл

пример: git checkout HEAD -- main.c

37 голосов
/ 07 ноября 2015

Минимальное руководство

git checkout -- <filename>


Ссылка: https://git -scm.com / docs / git-checkout

Dup: Отменить изменения рабочей копии одного файла в Git?

24 голосов
/ 10 сентября 2013

Теперь мы можем! Поскольку это первый результат в Google, я решил обновить его до последней версии. С появлением git 1.7.9.5 у нас есть команда git archive, которая позволит вам получить один файл с удаленного хоста.

git archive --remote=git://git.foo.com/project.git HEAD:path/in/repo filename | tar -x

Полный ответ см. Здесь https://stackoverflow.com/a/5324532/290784

21 голосов
/ 06 июля 2011

Работа в ГИТ 1.7.2.2

Например, у вас есть удаленный some_remote с филиалами branch1 , branch32

поэтому, чтобы оформить заказ на конкретный файл, вы вызываете следующие команды:

git checkout remote/branch path/to/file

в качестве примера это будет что-то вроде этого

git checkout some_remote/branch32 conf/en/myscript.conf
git checkout some_remote/branch1 conf/fr/load.wav

Эта команда извлечения скопирует всю файловую структуру conf / en и conf / fr в текущий каталог, где вы вызываете эти команды (конечно, я предполагаю, что вы запускали git init в некоторый момент раньше)

13 голосов
/ 21 апреля 2015

Очень просто:

git checkout from-branch-name -- path/to/the/file/you/want

Это не будет проверять ветку from-branch-name. Вы останетесь в той ветке, в которой находитесь, и только этот единственный файл будет извлечен из указанной ветки.

Вот соответствующая часть справочной страницы для git-checkout

git checkout [-p|--patch] [<tree-ish>] [--] <pathspec>...
       When <paths> or --patch are given, git checkout does not switch
       branches. It updates the named paths in the working tree from the
       index file or from a named <tree-ish> (most often a commit). In
       this case, the -b and --track options are meaningless and giving
       either of them results in an error. The <tree-ish> argument can be
       used to specify a specific tree-ish (i.e. commit, tag or tree) to
       update the index for the given paths before updating the working
       tree.

Шляпа для Арьеян де Врума, который научил меня этому из этого сообщения в блоге .

6 голосов
/ 13 февраля 2014

Вы можете сделать это по

git archive --format=tar --remote=origin HEAD | tar xf -
git archive --format=tar --remote=origin HEAD <file> | tar xf -
...