복제하지 않고 git 저장소에서 파일 찾아보기 및 표시


107

먼저 복제하지 않고 git repo에서 파일을 찾아보고 표시하는 방법이 있습니까? 명령을 사용하여 svn에서 수행 할 수 있습니다.

svn ls / path / to / repo 
svn cat / path / to / repo / file-in-repo

나는 아마도 git show를 사용할 수 있지만 다음을 수행합니다.

git show / path / to / repo
git show HEAD : / path / to / repo

결과

치명적 : 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은 중앙 집중식 (클라이언트-서버) 버전 제어 시스템입니다. 그들은 다르게 작동합니다. 그것에 익숙해 지십시오. StackOverflow에서 질문에 해당svn status -u 하는 git에 대한 그 차이의 결과를 설명하는 내 대답을 읽으십시오 .

약간 반복 : 중앙 집중식 버전 제어 시스템 (예 : CVS 또는 Subversion)에서는 거의 모든 명령이 서버 에서 처리되고 네트워크와 관련됩니다. 로컬에서 수행되는 명령은 거의 없습니다. "svn status"및 "svn diff"의 우수한 성능을 갖기 위해 Subversion은 클라이언트에 체크 아웃 된 버전의 '원본 복사본'을 저장하여 이러한 일반적인 작업에 대한 네트워크 전송을 포함 할 필요가 없습니다 (이는 Subversion checkout = 2 x 최소한 작업 디렉토리의 크기).

전체 저장소의 로컬 복사본 (복제)이있는 분산 버전 제어 시스템 (예 : Git, Mercurial 또는 Bazaar)에서는 거의 모든 명령이 client에서 수행됩니다 . 매우 적은 수의 명령에 다른 저장소 (서버)에 대한 네트워크 연결이 필요합니다.

서버에서 수행 할 수있는 명령 수는 제한되어 있습니다.

  • " git ls-remote <URL>"을 사용 하여 원격에있는 모든 참조를 나열 할 수 있습니다 .

  • " git archive --remote = <URL> HEAD"를 사용하여 저장소 (원격 서버가 활성화 된 경우)의 (일부) 스냅 샷을 얻을 수 있습니다 .

  • " git clone --depth = 1 <URL>"을 사용 하여 몇 개의 마지막 커밋 ( "shallow clone"이라고 함) 만 복제 할 수 있습니다 .
  • 서버가 저장소에 git 웹 인터페이스를 제공하는 경우이를 사용하여 찾아 볼 수 있습니다.

36
당신이 옳은 것처럼, 원격 저장소를 먼저 복제하지 않고 브라우징한다면 분명히 git의 오프라인 기능을 포기하는 것이 좋다고 결정한 것입니다. 그렇기 때문에 원격 저장소의 파일 내용을 로컬로 검색 할 수있는 로컬 클라이언트와 같은 일부 기능에 유용하지 않은 척할 이유가 없습니다.
LadyCailin

12
동의합니다. Jakub이 취하는 입장은 매우 제한적입니다. 이것을 지적하는 것은 한 번 이상 명성을 잃을 가치가 있습니다.
ctpenrose 2013

9
나는 "그것에 익숙해지다"라는 말이 싫다.하지만 끝까지 읽으면 현재 문제에 대한 해결책을 찾았다. 110 저장소에 무엇이 있는지보고 싶어서 하나의 자식이 있지만 ssh 또는 셸에 액세스 할 수없고 모두 12GB 정도가 될 것입니다. 따라서 최소화 된 깊이를 가진 클론은 최소한 최근의 흥미로운 역사 만 보는 데 도움이됩니다. git repo를 가능한 한 작게 만드십시오.
Henning 2014 년

3
이러한 기능은 전체 리포지토리가 필요하지 않은 코드 검토 도구의 경우 변경 사항을 기록하는 것으로 충분합니다.
Lukasz Lenart 2014 년

2
@Henning, 맞아요. "그것에 익숙한 자식"톤 LOL
SN

17

일부 전송 프로토콜에서이를 수행하는 방법에 대한 정보 는 http://git-scm.com/book/en/Git-Internals-Transfer-Protocols참조 하십시오 . SSH를 통한 표준 git에서는 작동하지 않습니다.

SSH를 통한 git의 경우 최신 서버 측 git을 사용하면 원격에서 직접 git-archive를 수행 할 수 있습니다. 예를 들어 "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

정확하지는 않지만 방법이 있습니다.

GitHub 개발자 API 사용

  1. 이것을 열면 최근 커밋을 얻을 수 있습니다.

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

    위의 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은 아무것도 반환하지 않는 것 같습니다.
Matthew Read

이제 Anarug의 api 방법을 확실히 권장합니다. 이 방법은 여전히 ​​작동합니다.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

8
당신이 :( 이전에 환매 특약을하지 복제 할 경우 작동하지 않습니다
발린 Szigeti
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.