Переглядайте та показуйте файли в git repo без клонування


107

Чи існує спосіб перегляду та відображення файлів у git repo, не спершу клонувавши його? Я можу робити те, у svn, використовуючи команди:

svn ls / шлях / до / репо 
svn cat / шлях / до / repo / file-in-repo

Я нібито можу використовувати git show, але роблю:

git show / шлях / до / репо
git show HEAD: / шлях / до / репо

результат до

фатально: Не сховище git

Відповіді:


72

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

Єдиний реальний спосіб зробити те, що ви хочете (якщо я правильно розумію), це використовувати ssh для запуску віддаленої команди та повернення результатів, наприклад:

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

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


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 у сховище, ви можете використовувати його для перегляду.

36
Як ви правильні, якщо ви переглядаєте віддалене репо, не попередньо його клонувавши, то, очевидно, ви вирішили, що нормально відмовитися від офлайн-можливостей git. Враховуючи це, я не бачу причин робити вигляд, що це не буде корисною функцією для деяких речей, наприклад, локального клієнта, який дозволяє вам переглядати вміст файлу віддаленого репо локально.
LadyCailin

12
Погоджено, позиція, яку займає Якуб, є дуже обмежувальною. Варто не раз втрачати репутацію, щоб це наголосити.
ctpenrose

9
Мені не подобається тон "звикнути до цього". Але, коли читаю до кінця, я знайшов рішення моєї поточної проблеми - хочу побачити, що знаходиться в 110 сховищі, у мене є одна git, але немає доступу до ssh або shell, і які все, мабуть, досить велике, близько 12 Гб або близько того. Тож клон із мінімізованою глибиною допомагає хоча б лише побачити недавню цікаву історію. і зробити git repo якомога меншим.
Хеннінг

3
Таку функціональність було б непогано мати у випадку інструментів перегляду коду, де вам не потрібен весь репо-просто журнал із змінами.
Лукаш Ленарт

2
@Henning, правда ти, я думаю, ти міг би назвати це "git звик до цього" тон 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 внутрішніх помилок сервера" "більше немає облікових даних"
MichaelChirico

5

Не точно, а навпаки.

Використовуйте API для розробників GitHub

  1. Якщо відкрити це, ви отримаєте останні зобов’язання.

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

    Ви можете отримати конкретні деталі фіксації, приєднавши хеш фіксування в кінці вищевказаної URL-адреси.

  2. Усі файли (вам потрібно sha для головного дерева)

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

Я сподіваюся, що це може допомогти.


17
Не плутайте Git з GitHub - я вважаю, що оригінальні запитання стосувалися самого Git. Установки / хостинг Git (GitHub / BitBucket / Stash) можуть мати різні можливості для сховищ браузера.
Кшиштоф Волній,

Гарна ідея @Anurag Kanungo Мислення поза коробкою 😉
еоніст

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.


Я не отримую з цього ніяких результатів. завиток, здається, нічого не повертає.
Матвій

Зараз я б точно рекомендував метод api від Anarug. Цей метод все ще працює, хоча:curl -s https://github.com/Itseez/opencv | grep js-directory-link | sed 's|.* title="\(.*\)".*|\1|'
Енн ван Россум

-1

якщо ви знаєте віддалену гілку, яку ви хочете перевірити, ви можете дізнатися останню інформацію за допомогою:

git ls-tree -r <remote_branch> --name-only

8
це не працює, якщо ви не клонували репо раніше :(
Bálint Szigeti
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.