Эквивалент в git "hg cat" или "svn cat" - PullRequest
82 голосов
/ 15 января 2010

Я хочу извлечь копию последней версии файла, хранящегося в репозитории git, и передать его в сценарий для некоторой обработки. С svn или hg я просто использую команду "cat":

Распечатать указанные файлы, как они были в данной ревизии. Если ревизия не указана, используется родительский каталог рабочего каталога, или совет, если ревизия не получена.

(это из описания hg cat в документации hg)

Какая эквивалентная команда для этого с git?

Ответы [ 9 ]

109 голосов
/ 15 января 2010
git show rev:path/to/file

Где rev - версия.

См. http://git.or.cz/course/svn.html для сравнения команд git и svn.

9 голосов
/ 29 января 2010

есть "git cat-file", который вы можете запустить так:

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

, где вы можете заменить 'v1.0' веткой, тегом или коммитом SHA, а затем 'path / to / file' с относительным путем в репозитории. Вы также можете передать '-s', чтобы увидеть размер содержимого, если хотите.

может быть ближе к командам 'cat', к которым вы привыкли, хотя ранее упомянутое 'show' будет делать то же самое.

5 голосов
/ 15 января 2010

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.
3 голосов
/ 18 января 2011

Также работайте с именами веток (например, HEAD в 1-м разделе):

git show $branch:$filename
2 голосов
/ 15 января 2010

Я написал скрипт оболочки git cat, который на github

2 голосов
/ 15 января 2010

Использование git show, как в git show commit_sha_id:path/to/some/file.cs.

1 голос
/ 15 января 2010

Похоже, нет прямой замены. Эта запись в блоге подробно описывает, как сделать эквивалент, определив последний коммит, затем определив хеш для файла в этом коммите и затем выгрузив его.

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

(запись в блоге содержит опечатки и использует вышеперечисленное с командой svn)

0 голосов
/ 09 июня 2015

Для тех, кто использует 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
0 голосов
/ 07 июня 2012

Ни одно из предложений git show действительно не удовлетворяет, потому что (как бы я ни пытался), я не могу найти способ не получить смету метаданных из верхней части вывода. Дух кота (1) просто показывает содержание. Это (ниже) принимает имя файла и необязательный номер. Число показывает, как вы хотите вернуться назад. (Фиксирует, что изменил этот файл. Фиксированные, которые не изменяют целевой файл, не учитываются.)

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

показывает содержимое файла filename.txt на момент последнего коммита имени файла .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 );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...