Просмотр и отображение файлов в репозитории git без клонирования

107

Есть ли способ просматривать и отображать файлы в репозитории git без предварительного клонирования? Я могу сделать это в svn, используя команды:

svn ls / путь / к / репо 
svn cat / путь / к / репо / файл в репо

Я предположительно могу использовать git show, но делаю:

git показать / путь / к / репо
git show HEAD: / путь / к / репо

результат к

фатальный: не репозиторий git
Кристиан Алис
источник

Ответы:

72

Вам нужна команда, git ls-remoteкоторая позволяет вам получить некоторую информацию об удаленных репозиториях, но вы не можете отображать историю, списки каталогов или что-либо подобное: по сути, она позволяет вам видеть удаленные объекты только на очень высоком уровне (вы можете видеть текущие заголовки и теги, например).

Единственный реальный способ сделать то, что вы хотите (если я правильно понимаю), - это использовать ssh для запуска удаленной команды и возврата результатов, например:

ssh me@otherhost "cd repo && git log -n 10"

То, что вы хотите, было бы прекрасной функциональностью, если бы они могли его добавить, но из того, что я читал, это не очень просто, поскольку для получения истории и т. Д. Требуется много информации, которая должна быть локальной для git, и в этот момент вы, возможно, также сделали git fetch .

jkp
источник
14
Однако вы можете git cloneполучить только одну ревизию путем передачи --depth 1. Это позволяет избежать получения потенциально больших объемов истории, и этого будет достаточно для ответа на такие вопросы, как «какие файлы присутствуют в ревизии abcdef1234567890
ctrueden
21

Git - это распределенная система контроля версий, а Subversion - централизованная (клиент-серверная) система контроля версий. Они работают по-разному; привыкнуть к этому. Прочтите мой ответ, объясняющий последствия этой разницы, в git-эквивалентеsvn status -u вопроса на StackOverflow.

Повторюсь: в централизованной системе контроля версий (например, CVS или Subversion) почти все команды обрабатываются на сервере и связаны с сетью. Локально выполняется очень мало команд. Обратите внимание, что для обеспечения хорошей производительности «svn status» и «svn diff» Subversion сохраняет «чистую копию» извлеченной версии на клиенте, чтобы не задействовать сетевую передачу для этих общих операций (это означает, что Subversion checkout = 2 x размер рабочего каталога минимум).

В распределенной системе контроля версий (например, Git, Mercurial или Bazaar), где у вас есть локальная копия (клон) всего репозитория, почти все команды выполняются на клиенте . Очень немногие команды требуют сетевого подключения к другому репозиторию (к серверу).

Количество команд, которые вы можете выполнять на сервере, ограничено.

  • Вы можете перечислить все ссылки на удаленном компьютере с помощью " git ls-remote <URL>".
  • Вы можете получить снимок (части) репозитория (если это разрешено удаленным сервером) с помощью
    « git archive --remote = <URL> HEAD».
  • Вы можете клонировать только несколько последних коммитов (так называемый «поверхностный клон») с помощью
    « git clone --depth = 1 <URL>».
  • Если сервер предоставляет веб-интерфейс git для репозитория, вы можете использовать его для просмотра.
Якуб Наребски
источник
37
Как бы вы ни были правы, если вы просматриваете удаленное репо без его предварительного клонирования, то, очевидно, вы решили, что можно отказаться от автономных возможностей git. Учитывая это, я не вижу причин делать вид, что эта функция не будет полезной для некоторых вещей, например, для локального клиента, который позволяет вам просматривать содержимое файла удаленного репо локально.
LadyCailin 01
12
Согласны, позиция, которую занимает Якуб, носит весьма ограничительный характер. Чтобы указать на это, стоит потерять репутацию не раз.
ctpenrose
9
Мне не нравится тон «привыкните к этому», но, прочитав до конца, я нашел решение моей текущей проблемы - хочу посмотреть, что находится в репозитории 110, у меня есть один git, но нет доступа к ssh или оболочке, и которые все, вероятно, довольно большие, около 12 ГБ. Таким образом, клон с уменьшенной глубиной помогает, по крайней мере, увидеть только недавнюю интересную историю. и сделайте репозиторий git как можно меньше.
Henning
3
Такую функциональность было бы неплохо иметь в случае инструментов обзора кода, когда вам не нужно целое репо, достаточно просто журнала с изменениями.
Лукаш Ленарт
2
@Henning, Правильно, я думаю, вы могли бы назвать это "мерзавцем, привыкшим к этому" тону LOL
SN
17

Взгляните на http://git-scm.com/book/en/Git-Internals-Transfer-Protocols для получения информации о том, как это сделать с помощью некоторых транспортных протоколов. Обратите внимание, что это не будет работать для стандартного git через SSH.

Для git через SSH обновленный серверный git должен позволять вам архивировать git прямо с удаленного компьютера, который затем можно было бы передать, например, «tar t», чтобы получить список всех файлов в данном коммите.

Джером Баум
источник
13

GitHub совместим с svn, поэтому вы можете использовать svn ls

svn ls https://github.com/user/repository.git/branches/master/

BitBucket поддерживает архив git, поэтому вы можете загружать архив tar и просматривать заархивированные файлы. Это не очень эффективно, но работает:

git archive --remote=git@bitbucket.org:repository HEAD directory | tar -t
фела
источник
6
Не путайте Git с GitHub :)
LR
он также кажется довольно хрупким - работает на многих (около 100) репозиториях, я получаю различные ошибки от svn: «не удается получить записи вне каталога» «500 Internal Server Error» «Нет учетных данных»
MichaelChirico
5

Не совсем точно, но наоборот.

Используйте GitHub Developer API

  1. Открыв это, вы получите последние коммиты.

    https://api.github.com/repos/learningequality/ka-lite/commit

    Вы можете получить конкретную информацию о фиксации, прикрепив хеш фиксации в конце указанного выше URL.

  2. Все файлы (для основного дерева нужен sha)

    https://api.github.com/repos/learningequality/ka-lite/git/trees/7b698a988683b161bdcd48a949b01e2b336b4c01

Надеюсь, это поможет.

Анураг Канунго
источник
17
Не путайте Git с GitHub - я считаю, что изначально вопросы касались самого Git. Установки / хостинг Git (GitHub / BitBucket / Stash) могут иметь различные возможности для репозиториев браузера.
Krzysztof Wolny
Хорошая идея @Anurag Kanungo Мыслить нестандартно 😉
eonist
2

Некоторые, вероятно, сочтут это грязным, но очень практичным решением в случае репозиториев github является создание скрипта, например "git-ls":

#!/bin/sh
remote_url=${1:? "$0 requires URL as argument"}
curl -s $remote_url | grep js-directory-link | sed "s/.* title=\"\(.*\)\".*/\1/"

Сделать его исполняемым и достижимы конечно: chmod a+x git-ls; sudo cp git-ls /usr/local/bin. Теперь вы просто запускаете его, как хотите:

git-ls https://github.com/mrquincle/aim-bzr
git-ls https://github.com/mrquincle/aim-bzr/tree/master/aim_modules

Также знайте, что есть git instawebутилита для ваших локальных файлов. Возможность показывать файлы и иметь такой сервер, на мой взгляд, не нарушает никаких децентрализованных характеристик, присущих git.

Анн ван Россум
источник
Я не получаю от этого никаких результатов. curl, похоже, ничего не возвращает.
Мэтью Рид
Теперь я определенно рекомендую метод api от Anarug. Однако этот метод все еще работает:curl -s https://github.com/Itseez/opencv | grep js-directory-link | sed 's|.* title="\(.*\)".*|\1|'
Anne van Rossum
-1

если вы знаете удаленную ветку, которую хотите проверить, вы можете узнать последнюю версию через:

git ls-tree -r <remote_branch> --name-only
LinconFive
источник
8
это не сработает, если вы не клонируете репо ранее :(
Балинт Сигети