2009-07-14 6 views
163

Каков наиболее эффективный механизм (в отношении переданных данных и используемого дискового пространства) для получения содержимого одного файла из удаленного репозитория git?Извлечение одного файла из репозитория

До сих пор мне удалось придумать:

git clone --no-checkout --depth 1 [email protected]:foo/bar.git && cd bar && git show HEAD:path/to/file.txt 

Это все еще кажется излишеством.

Как получить несколько файлов из репо?

+2

Aaw. Мне бы это понравилось, если бы был встроенный способ сделать эквивалент «cat-remote» и «tag-remote». – conny

+3

У меня такая же проблема, я хочу иметь один и тот же файл лицензии в 2 репозиториях; отредактируйте файл в 1 репо, затем попросите его автоматически обновить копию в другом репо. – GlassGhost

+0

Возможный дубликат [Как проверить только один файл из репозитория git?] (Http://stackoverflow.com/questions/2466735/how-to-checkout-only-one-file-from-git-repository) –

ответ

40

Если есть веб-интерфейс (например, gitweb, cgit, Gitorious, ginatra), вы можете использовать его для загрузки одного файла («сырой» или «простой» вид).

Если другая сторона позволила ему, вы можете использовать опцию git archive «S» --remote=<URL> '(и, возможно, ограничить его в каталог данный файл находится в), например:

$ git archive [email protected]:foo/bar.git --prefix=path/to/ HEAD:path/to/ | tar xvf - 
+0

Примечание: пример не был протестирован! –

+6

Для ваших собственных репозиториев вам нужно специально включить upload-archive, если использовать git-daemon (git: // style urls) с помощью 'git config daemon.uploadarch true' в удаленном репозитории. По умолчанию git daemon отключает удаленный архив с «фатальным: удаленная ошибка: доступ запрещен или репозиторий не экспортирован: ...» – patthoyts

+0

+1 Подход «git archive» был моей первой попыткой, но потом я заметил, что для «tar» требуется клиентская машина была не совсем удобна для пользователей Windows. Мы попали на наш локальный сервер 'cgit'. Он работает, но это не так быстро, как мне бы хотелось (и для этого все еще требуется запустить 'unix2dos' или аналогичный на машинах Windows, поскольку мы храним файлы с окончанием строки Unix в репозитории Git). –

37

Вслед от Jakub до answer. git archive производит деготь или почтовый архив, так что вам нужно трубы выход через дегтя, чтобы получить содержимое файла:

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

сохранит копию «имя файла» от главы удаленного хранилища в текущем каталоге.

:path/to/directory часть не является обязательным. Если исключено, извлеченной файл будет сохранен в <current working dir>/path/to/directory/filename

Кроме того, если вы хотите, чтобы разрешить использование git archive --remote на Git репозитории, размещенном на GIT-демон, то Вам необходимо включить опцию daemon.uploadarch конфигурации. См https://kernel.org/pub/software/scm/git/docs/git-daemon.html

+1

Если это текстовый файл, и мы хотим сохранить его в другой части, вам нужно использовать: | tar -xO> ~/destfile.ext – yucer

7

Похоже, решение мне: http://gitready.com/intermediate/2009/02/27/get-a-file-from-a-specific-revision.html

мерзавец показать ГОЛОВЫ ~ 4: index.html> local_file

где 4 означает четыре ревизии теперь и ~ является тильда, как указано в комментарии.

+0

Не забудьте заметить, что это НЕ знак минуса '' - 'между' HEAD 'и' 4 ', но' тильда '' ~ '. По-видимому, я недостаточно хорошо читал git docs, или мои очки нуждаются в обновлении ;-) – Dennis

+16

Это, похоже, не получает файл из удаленного репозитория, хотя, как и необходимость OP. –

+0

Или: '' 'git show HEAD: ./ my_other_file> local_file''', если файл отсутствует в вашем корневом каталоге :) – kenorb

5

Я использую этот

$ cat ~/.wgetrc 
check_certificate = off 

$ wget https://raw.github.com/jquery/jquery/master/grunt.js 
HTTP request sent, awaiting response... 200 OK 
Length: 11339 (11K) [text/plain] 
Saving to: `grunt.js' 
+0

Работает для меня даже без wgetrc tweaks: 'wget https: // raw.github.com/bk322/bk_automates/master/bkubuntu/bkubuntu.bash' – Adobe

+1

Мое сообщение более полезна:' ERROR: Ошибка проверки сертификата для raw.github .com: невозможно получить сертификат локального эмитента. '**' Чтобы подключиться к raw.github.com небезопасно, используйте «-no-check-certificate». ** ** – Kos

+1

Это работает только для публичных репозиториев. Для частных репозиториев вам нужна аутентификация. –

108

в мерзавца версии 1.7.9.5 это похоже на работу, чтобы экспортировать один файл с удаленного

git archive --remote=ssh://host/pathto/repo.git HEAD README.md 

Это будет кот содержимое файла README.md.

+17

... Кроме того, GitHub не работает. Dang. :(https://twitter.com/GitHubHelp/status/322818593748303873 –

+10

Это не похоже на необработанный файл, а на файл tar только с одним файлом. –

+16

@FrerichRaabe просто добавьте '| tar -x' в 'git archive --remote = ssh: //host/pathto/repo.git HEAD README.md | tar -x' ' cat README.md' – renier

-2

Относительно ответа @Steven Penny, я также использую wget. Кроме того, чтобы решить, какой файл для отправки вывода мне использовать -O.

Если вы используете gitlabs другой возможности для URL является:

wget "https://git.labs.your-server/your-repo/raw/master/<path-to-file>" -O <output-file> 

Если у вас есть сертификат или доступ из доверенного сервера для установки gitlabs вам нужен --no-регистрация сертификат в качестве @ Сказал Кос. Я предпочитаю это вместо того, чтобы модифицировать .wgetrc, но это зависит от ваших потребностей.

Если это большой файл, вы можете использовать опцию -c с wget. Чтобы продолжить загрузку файла с того места, где вы его оставили, если предыдущее намерение не удалось посередине.

0

Я использую curl, он работает с публичными репозиториями или с использованием базовой аутентификации https через веб-интерфейс.

curl -L --retry 20 --retry-delay 2 -O https://github.com/ACCOUNT/REPO/raw/master/PATH/TO/FILE/FILE.TXT -u USER:PASSWORD

Я проверил его на GitHub и BitBucket, работает на обоих.

16

Не в целом, но если вы используете Github:

Для меня wget к сырому URL оказался лучший и простой способ загрузить один конкретный файл.

Открыть файл в браузере и нажать кнопку «Raw». Обновите свой браузер, скопируйте URL-адрес и сделайте wget или curl на нем.

Wget Пример:

wget 'https://github.abc.abc.com/raw/abc/folder1/master/folder2/myfile.py?token=DDDDnkl92Kw8829jhXXoxBaVJIYW-h7zks5Vy9I-wA%3D%3D' -O myfile.py

Curl пример:

curl 'https://example.com/raw.txt' > savedFile.txt

+3

Это самое простое решение и работает для любого необработанного txt, который можно найти. 'curl https://example.com/raw.txt> savedFile.txt' – JacobPariseau

+0

wget-пример не работает, однако пример скручивания. –

+0

Работает только для меня. Вы указали свой URL в кавычках на командной строке? – abc

8

Чтобы экспортировать один файл из отдаленного:

git archive --remote=ssh://host/pathto/repo.git HEAD README.md | tar -x 

Это загрузит файл README.md в ваш текущий каталог.

Если вы хотите, содержимое файла, экспортируемого в STDOUT:

git archive --remote=ssh://host/pathto/repo.git HEAD README.md | tar -xO 

Вы можете предоставить несколько путей в конце команды.

1

Yisrael Dov's answer - простой, но он не позволяет сжатие. Вы можете использовать --format=zip, но вы не можете напрямую распаковать его с помощью команды pipe, как вы можете, с tar, поэтому вам нужно сохранить ее как временный файл. Вот сценарий:

#!/bin/bash 

BASENAME=$0 

function usage { 
    echo "usage: $BASENAME <remote-repo> <file> ..." 
    exit 1 
} 

[ 2 -gt "$#" ] && { usage; } 

REPO=$1 
shift 
[email protected] 

TMPFILE=`mktemp`.zip 
git archive -9 --remote=$REPO HEAD $FILES -o $TMPFILE 
unzip $TMPFILE 
rm $TMPFILE 

Это также работает с каталогами.

2

разносторонний вариант некоторые из ответов здесь, что ответы на вопрос OP еще:

git archive [email protected]:foo/bar.git HEAD path/to/file.txt | tar -xO path/to/file.txt > file.txt 
0

Если вы хотите, чтобы получить файл из определенного хэша + удаленного хранилища Я попытался ГИТ-архив и его не работает.

Вам нужно будет использовать git clone, и как только клонирование будет клонировано, вы должны будете использовать git-архив, чтобы заставить его работать.

я отправляю вопрос о том, как сделать его более простым в git archive from a specific hash from remote

0

Для одного файла, просто используйте Wget команду.

Сначала следуйте рисунку ниже, чтобы щелкнуть «raw», чтобы получить URL-адрес, иначе вы загрузите код, встроенный в html. enter image description here

Затем браузер откроет новую страницу с URL начать с https://raw.githubusercontent.com/ ...

просто введите команду в терминале:

#wget https://raw.githubusercontent.com/... 

А пока файл будет положить в ваш папка.

0

Если репозиторий поддерживает токены (например, GitLab), то создайте токен для своего пользователя, затем перейдите к файлу, который вы загрузите, и нажмите на выход RAW, чтобы получить URL-адрес. Чтобы скачать файл следует использовать:

curl --silent --request GET --header 'PRIVATE-TOKEN: replace_with_your_token' \ 
'http://git.example.com/foo/bar.sql' --output /tmp/bar.sql 
Смежные вопросы