Ответ 1
в git версии 1.7.9.5 это, похоже, работает для экспорта одного файла с удаленного
git archive --remote=ssh://host/pathto/repo.git HEAD README.md
Это будет содержать содержимое файла README.md
.
Каков наиболее эффективный механизм (в отношении переданных данных и используемого дискового пространства) для получения содержимого одного файла из удаленного хранилища git?
До сих пор мне удалось найти:
git clone --no-checkout --depth 1 [email protected]:foo/bar.git && cd bar && git show HEAD:path/to/file.txt
Это все еще кажется излишним.
Как получить несколько файлов из репо?
в git версии 1.7.9.5 это, похоже, работает для экспорта одного файла с удаленного
git archive --remote=ssh://host/pathto/repo.git HEAD README.md
Это будет содержать содержимое файла README.md
.
Исходя из ответа Якуба. git archive
создает tar или zip архив, поэтому вам нужно передать вывод через tar, чтобы получить содержимое файла:
git archive --remote=git://git.foo.com/project.git HEAD:path/to/directory filename | tar -x
Сохранит копию "filename" из HEAD удаленного репозитория в текущем каталоге.
Часть :path/to/directory
является необязательной. Если исключено, извлеченный файл будет сохранен в <current working dir>/path/to/directory/filename
Кроме того, если вы хотите включить использование git archive --remote
в репозиториях Git, размещенных в git-daemon, вам необходимо включить опцию конфигурации daemon.uploadarch. См. Https://kernel.org/pub/software/scm/git/docs/git-daemon.html.
Если используется веб-интерфейс (например, gitweb, cgit, Gitorious, ginatra), вы можете использовать его для загрузки одного файла ( "raw" или "plain" ).
Если с другой стороны это разрешено, вы можете использовать git archive '--remote=<URL>
' (и возможно ограничить его каталогом, в котором находится данный файл), например:
$ git archive [email protected]:foo/bar.git --prefix=path/to/ HEAD:path/to/ | tar xvf -
Не в общем, но если вы используете 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 'https://example.com/raw.txt' > savedFile.txt
Чтобы экспортировать один файл с удаленного устройства:
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
Вы можете указать несколько путей в конце команды.
Это выглядит как решение для меня: http://gitready.com/intermediate/2009/02/27/get-a-file-from-a-specific-revision.html
git показать HEAD ~ 4: index.html > local_file
где 4
означает четыре версии с этого момента, а ~
- тильда, как указано в комментарии.
Я использую этот
$ 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'
Нюансированный вариант некоторых ответов здесь, который отвечает на вопрос ОП:
git archive [email protected]:foo/bar.git \
HEAD path/to/file.txt | tar -xO path/to/file.txt > file.txt
Если ваш репозиторий поддерживает токены (например, 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
Ответ Исраэля Дова является простым, но он не позволяет сжатие. Вы можете использовать --format=zip
, но вы не можете напрямую распаковать его с помощью команды pipe, как вы можете, с помощью tar, поэтому вам нужно сохранить ее как временный файл. Здесь a script:
#!/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
Это также работает с каталогами.
Для одного файла просто используйте команду wget.
Сначала следуйте рисунку ниже, чтобы щелкнуть "raw", чтобы получить URL-адрес, иначе вы загрузите код, встроенный в html.
Затем браузер откроет новую страницу с URL-адресом, начинающимся с https://raw.githubusercontent.com/...
просто введите команду в терминал:
#wget https://raw.githubusercontent.com/...
A, пока файл будет помещен в вашу папку.
Если ваш репозиторий Git размещен в Azure-DevOps (VSTS), вы можете получить один файл с помощью Rest API.
Формат этого API выглядит следующим образом:
https://dev.azure.com/{organization}/_apis/git/repositories/{repositoryId}/items?path={pathToFile}&api-version=4.1?download=true
Например:
https://dev.azure.com/{organization}/_apis/git/repositories/278d5cd2-584d-4b63-824a-2ba458937249/items?scopePath=/MyWebSite/MyWebSite/Views/Home/_Home.cshtml&download=true&api-version=4.1
Я решил таким образом:
git archive --remote=ssh://[email protected]/user/mi-repo.git BranchName /path-to-file/file_name | tar -xO /path-to-file/file_name > /path-to-save-the-file/file_name
Если вы хотите, вы можете заменить "BranchName" на "HEAD"
Я использую 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, работает на обоих.
Если вы хотите получить файл из определенного хеша + удаленного репозитория, я пробовал git -archive, и он не работал.
Вам нужно будет использовать клон git, и как только клонирование будет клонировано, вы должны использовать git -archive, чтобы он работал.
Я поставил вопрос о том, как сделать это проще в архиве git из определенного хэша с удаленного.
для bitbucket непосредственно из браузера (я использовал safari...), щелкните правой кнопкой мыши "View Raw" и выберите "Download Linked File":
Если вы не возражаете против клонирования всего каталога, эта небольшая функция bash/zsh будет иметь конечный результат клонирования одного файла в текущий каталог (путем клонирования репо во временный каталог и последующего удаления его).
Pro: Вы получаете только тот файл, который хотите
Con: Вы все еще должны ждать клонирования всего репо
git-single-file () {
if [ $# -lt 2 ]
then
echo "Usage: $0 <repo url> <file path>"
return
fi
TEMP_DIR=$(mktemp -d)
git clone $1 $TEMP_DIR
cp $TEMP_DIR/$2 .
rm -rf $TEMP_DIR
}
Github Enterprise Solution
HTTPS_DOMAIN=https://git.your-company.com
ORGANISATION=org
REPO_NAME=my-amazing-library
FILE_PATH=path/to/some/file
BRANCH=develop
GITHUB_PERSONAL_ACCESS_TOKEN=<your-access-token>
URL="${HTTPS_DOMAIN}/raw/${ORGANISATION}/${REPO_NAME}/${BRANCH}/${FILE_PATH}"
curl -H "Authorization: token ${GITHUB_PERSONAL_ACCESS_TOKEN}" ${URL} > "${FILE_PATH}"
Относительно ответа @Steven Penny, я также использую wget. Кроме того, чтобы решить, какой файл для отправки вывода мне использовать -O.
Если вы используете gitlabs, другая возможность для URL-адреса:
wget "https://git.labs.your-server/your-repo/raw/master/<path-to-file>" -O <output-file>
Если у вас нет сертификата или вы получаете доступ с доверенного сервера для установки gitlabs, вам нужно --no-check-certificate, как сказал @Kos. Я предпочитаю это вместо того, чтобы модифицировать .wgetrc, но это зависит от ваших потребностей.
Если это большой файл, вы можете использовать опцию -c с помощью wget. Чтобы продолжить загрузку файла с того места, где вы его оставили, если предыдущее намерение не удалось посередине.