"Hg बिल्ली" या "svn बिल्ली" के बराबर में


84

मैं एक गिट रिपॉजिटरी में रखी गई फ़ाइल के नवीनतम संस्करण की एक प्रति निकालना चाहता हूं, और इसे कुछ प्रसंस्करण के लिए एक स्क्रिप्ट में पास करता हूं। Svn या hg के साथ, मैं सिर्फ "कैट" कमांड का उपयोग करता हूं:

निर्दिष्ट फाइलों को प्रिंट करें क्योंकि वे दिए गए संशोधन में थे। यदि कोई संशोधन नहीं दिया जाता है, तो कामकाजी निर्देशिका के माता-पिता का उपयोग किया जाता है, या यदि कोई संशोधन की जाँच नहीं की जाती है तो टिप दें।

(यह hg बिल्ली के विवरण से hg प्रलेखन में है)

Git के साथ ऐसा करने के लिए समतुल्य कमांड क्या है?


4
मेरा अंतिम समाधान पहले "git ls-files --full-name <filepath>" का उपयोग करना था, रिपॉजिटरी के शीर्ष के सापेक्ष पूर्ण पथ प्राप्त करने के लिए, और फिर "git show HEAD: <full filepath>"
रिचर्ड बौल्टन


जवाबों:


113
git show rev:path/to/file

कहाँ राजस्व संशोधन है।

Git और svn कमांड की तुलना के लिए http://git.or.cz/course/svn.html देखें ।


1
यह मेरे लिए काम करता है, याय! (संशोधन के रूप में हेड का उपयोग करना) मुझे लगता है कि मुझे रिपॉजिटरी के शीर्ष के सापेक्ष पथ का उपयोग करने की आवश्यकता है, जो थोड़ा दर्द है, लेकिन काम करने योग्य है।
रिचर्ड बॉल्टन


@pimlottc ने बिना मेरे लिए ठीक काम किया ।/ - git वर्जन पर निर्भर हो सकता है
Trejkaz

9

"git cat-file" है जिसे आप इस तरह चला सकते हैं:

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

जहाँ आप 'v1.0' को शाखा, टैग या प्रतिबद्ध SHA से बदल सकते हैं और फिर रिपॉजिटरी में संबंधित पथ के साथ 'पाथ / टू / फाइल' कर सकते हैं। यदि आप चाहते हैं तो सामग्री का आकार देखने के लिए आप '-s' भी पास कर सकते हैं।

आपके द्वारा उपयोग की जाने वाली 'बिल्ली' कमांड के करीब हो सकता है, हालांकि पहले उल्लेखित 'शो' बहुत कुछ करेगा।


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" चलाने से घातक: अस्पष्ट तर्क 'अगला ~ 1: README' उत्पन्न होता है: अज्ञात संशोधन या कार्यशील पेड़ में पथ नहीं। संशोधन से पथों को अलग करने के लिए '-' का प्रयोग करें
रिचर्ड बौल्टन

1
क्या आपके पास 'नेक्स्ट' नामक शाखा है? यदि आप वर्तमान शाखा चाहते हैं, तो इसके बजाय 'हेड' का उपयोग करें।
एंड्रयू आइलेट

3

शाखा नामों के साथ भी काम करें (जैसे 1 पी में हेड):

git show $branch:$filename


2

मैंने एक गिट कैट शेल स्क्रिप्ट लिखी, जो गितुब पर है


1
इसके लिए कोड को देखना मददगार था, हालाँकि मैं एक स्टैंडअलोन पायथन स्क्रिप्ट चाहता था, और इसमें गिट कैट की सभी विशेषताओं की आवश्यकता नहीं थी। धन्यवाद।
रिचर्ड बौल्टन

1

वहाँ एक सीधा विकल्प प्रतीत नहीं होता है । यह ब्लॉग प्रविष्टि यह बताती है कि नवीनतम कमिट का निर्धारण करके समकक्ष कैसे किया जाता है , फिर उस कमिट में फाइल के लिए हैश का निर्धारण किया जाता है, और फिर उसे डंप किया जाता है।

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

(ब्लॉग प्रविष्टि में टाइपोस है और कमांड के साथ उपरोक्त का उपयोग करता है svn)


टाइपो के बावजूद ब्लॉग प्रविष्टि सहायक थी।
रिचर्ड बॉल्टन

0

git showसुझावों में से कोई भी वास्तव में संतुष्ट नहीं है क्योंकि (जैसा कि हो सकता है) का प्रयास करें, मुझे आउटपुट के शीर्ष से मेटाडेटा cruft प्राप्त नहीं करने का एक तरीका नहीं मिल सकता है। बिल्ली (1) की भावना केवल सामग्री दिखाने के लिए है। यह (नीचे) एक फ़ाइल नाम और एक वैकल्पिक नंबर लेता है। संख्या यह है कि आप किस तरह से वापस जाना चाहते हैं। (उस फ़ाइल को परिवर्तित करने वाले कमिट करता है। लक्ष्य फ़ाइल को नहीं बदलने वाले कमिट नहीं गिने जाते हैं।)

gitcat.pl filename.txt
gitcat.pl -3 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

बाश का उपयोग करने वालों के लिए निम्नलिखित एक उपयोगी कार्य है:

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.