"hg cat"또는 "svn cat"의 git에 해당


84

git 저장소에 보관 된 최신 버전의 파일 사본을 추출하여 일부 처리를 위해 스크립트에 전달하고 싶습니다. svn 또는 hg에서는 "cat"명령을 사용합니다.

지정된 개정판에있는 그대로 지정된 파일을 인쇄합니다. 개정이 제공되지 않으면 작업 디렉토리의 상위가 사용되고 개정이 체크 아웃되지 않은 경우 팁이 사용됩니다.

(hg 문서의 hg cat에 대한 설명에서 발췌)

git로이 작업을 수행하는 동등한 명령은 무엇입니까?


4
내 마지막 해결책은 먼저 "git ls-files --full-name <filepath>"를 사용하여 저장소 상단에 대한 전체 경로를 가져온 다음 "git show HEAD : <full filepath>"
Richard Boulton


답변:


113
git show rev:path/to/file

여기서 rev 는 개정판입니다.

git 및 svn 명령 비교는 http://git.or.cz/course/svn.html 을 참조하십시오 .


1
이것은 나를 위해 작동합니다, 예! (HEAD를 개정판으로 사용) 저장소 상단에 상대적인 경로를 사용해야한다고 생각하는데, 약간 고통 스럽지만 실행 가능합니다.
Richard Boulton

@Richard Boulton : 탭 완성을 사용하면 덜 고통 스럽습니다
ks1322

@pimlottc은 ./를 빼고 나를 위해 벌금을 일 - 자식 버전에 따라 다릅니다 수
Trejkaz

9

다음과 같이 실행할 수있는 "git cat-file"이 있습니다.

$ git cat-file blob v1.0:path/to/file

여기서 'v1.0'을 원하는 브랜치, 태그 또는 커밋 SHA로 바꾼 다음 'path / to / file'을 저장소의 상대 경로로 바꿀 수 있습니다. 원하는 경우 '-s'를 전달하여 콘텐츠의 크기를 확인할 수도 있습니다.

이전에 언급 한 'show'가 거의 동일한 작업을 수행하지만 익숙한 'cat'명령에 더 가깝습니다.


6

git show찾고있는 명령입니다. 문서에서 :

   git show next~10:Documentation/README
          Shows the contents of the file Documentation/README as they were
          current in the 10th last commit of the branch next.

작동하지 않는 것 같습니다. "git show next ~ 1 : README"를 실행하면 치명적 : 모호한 인수 'next ~ 1 : README': 알 수없는 개정판 또는 경로가 작업 트리에 없습니다. '-'를 사용하여 경로를 개정에서 분리
Richard Boulton

1
'next'라는 지점이 있습니까? 현재 분기를 원하면 대신 'HEAD'를 사용하십시오.
Andrew Aylett

3

또한 브랜치 이름으로 작업하십시오 (1st p의 HEAD와 같은) :

git show $branch:$filename


2

github에 있는 git cat shell 스크립트를 작성했습니다.


1
이에 대한 코드를 보면 도움이되었지만 독립 실행 형 파이썬 스크립트를 원했고 git cat의 모든 기능이 필요하지는 않았습니다. 감사.
Richard Boulton

1

직접적인 대체물 이없는 것 같습니다 . 이 블로그 항목최신 커밋을 결정한 다음 해당 커밋의 파일에 대한 해시를 결정한 다음 덤프 하여 동일한 작업을 수행하는 방법을 자세히 설명합니다 .

git log ...
git ls-tree ...
git show -p ...

(블로그 항목에 오타가 있으며 위의 명령을 명령과 함께 사용 svn)


오타에도 불구하고 블로그 항목이 도움이되었습니다.
Richard Boulton

0

어떤 git show제안도 진정 만족스럽지 않습니다. 왜냐하면 (내가 할 수있는대로 시도해보세요), 출력 상단에서 메타 데이터를 가져 오지 않는 방법을 찾을 수 없기 때문입니다. cat (1)의 정신은 내용을 보여주는 것뿐입니다. 이것은 (아래) 파일 이름과 선택적 번호를 사용합니다. 숫자는 되돌리고 싶은 커밋 방법입니다. (해당 파일을 변경 한 커밋. 대상 파일을 변경하지 않은 커밋은 계산되지 않습니다.)

gitcat.pl filename.txt
gitcat.pl -3 filename.txt

filename.txt의 최신 커밋 시점의 filename.txt 내용과 그 이전의 3 개 커밋 내용을 보여줍니다.

#!/usr/bin/perl -w

use strict;
use warnings;
use FileHandle;
use Cwd;

# Have I mentioned lately how much I despise git?

(my $prog = $0) =~ s!.*/!!;
my $usage = "Usage: $prog [revisions-ago] filename\n";

die( $usage ) if( ! @ARGV );
my( $revision, $fname ) = @ARGV;

if( ! $fname && -f $revision ) {
    ( $fname, $revision ) = ( $revision, 0 );
}

gitcat( $fname, $revision );

sub gitcat {
    my( $fname, $revision ) = @_;

    my $rev = $revision;
    my $file = FileHandle->new( "git log --format=oneline '$fname' |" );

    # Get the $revisionth line from the log.
    my $line;
    for( 0..$revision ) {
        $line = $file->getline();
    }

    die( "Could not get line $revision from the log for $fname.\n" ) 
        if( ! $line );

    # Get the hash from that.
    my $hash = substr( $line, 0, 40 );
    if( ! $hash =~ m/ ^ ( [0-9a-fA-F]{40} )/x ) {
        die( "The commit hash does not look a hash.\n" );
    }

    # Git needs the path from the root of the repo to the file because it can
    # not work out the path itself.
    my $path = pathhere();
    if( ! $path ) {
        die( "Could not find the git repository.\n" );
    }

    exec( "git cat-file blob $hash:$path/'$fname'" );
}


# Get the path from the git repo to the current dir.
sub pathhere {
    my $cwd = getcwd();
    my @cwd = split( '/', $cwd );
    my @path;

    while( ! -d "$cwd/.git" ) {
        my $path = pop( @cwd );
        unshift( @path, $path );
        if( ! @cwd ) {
            die( "Did not find .git in or above your pwd.\n" );
        }
        $cwd = join( '/', @cwd );
    }
    return join( '/', map { "'$_'"; } @path );
}

0

bash를 사용하는 사람들에게는 다음이 유용한 기능입니다.

gcat () { if [ $# -lt 1 ]; then echo "Usage: $FUNCNAME [rev] file"; elif [ $# -lt 2 ]; then git show HEAD:./$*; else git show $1:./$2; fi }

.bashrc파일에 넣으십시오 ( gcat.

사용 예 :

> gcat
Usage: gcat [rev] file

또는

> gcat subdirectory/file.ext

또는

> gcat rev subdirectory/file.ext
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.