यदि मेरे पास एक विशिष्ट हैश है, तो इसे A कहें, मैं A^ द्वारा माता-पिता से मिल सकता हूं। लेकिन क्या शाखा के इतिहास में A के बाद की प्रतिबद्धता को पूरा करने का कोई तरीका है? कुछ ऐसा A+1, जैसे कि A, (A+1)^ हो? मैं उस प्रतिबद्धता की जांच करना चाहता हूं जिसके लिए मेरे पास हैश है, और फिर उसके बाद एक, और इसी तरह, उनका निरीक्षण करने के लिए। लेकिन वे वास्तव में दफन हैं। गिट लॉग आउटपुट खोजने के अलावा संदर्भ हैश दिए गए उन्हें जांचने का कोई आसान तरीका?

0
temporary_user_name 14 सितंबर 2020, 21:42

2 जवाब

सबसे बढ़िया उत्तर

मैं उस प्रतिबद्धता की जांच करना चाहता हूं जिसके लिए मेरे पास हैश है, और फिर उसके बाद एक, और इसी तरह, उनका निरीक्षण करने के लिए

git rev-list --first-parent --reverse $thathash..mybranch

आपको उन सभी कमिट्स की सूची देगा, जिन्हें आप क्रम से देखना चाहते हैं। यदि आप केवल रैखिक इतिहास नहीं चाहते हैं, लेकिन शाखा टिप इतिहास में उस हैश से उतरे सभी कमिट --first-parent को --ancestry-path से बदल देते हैं और आप यह तय करने के लिए अनुक्रमण विकल्पों का उपयोग कर सकते हैं कि उन्हें किस क्रम में जाना है।

3
jthill 14 सितंबर 2020, 22:30

दो कमिट के बीच एक रेखीय पथ खोजने के लिए कोई अंतर्निहित कमांड नहीं है; इसके लिए आपको एक बाहरी स्क्रिप्ट लिखनी होगी।

यहां एक उदाहरण दिया गया है, जो पर्ल में लिखा गया है (this answer से) :

# in file 'git-path.pl' :
#!/usr/bin/perl

use strict;
use warnings;

# This script implements a breadth first search, starting from $target,
# following the 'child -> parent' links, until $source is found or the
# complete history of $target is traversed.

my $source = $ARGV[0];
my $target = $ARGV[1];

my $srcsha = `git rev-parse -q --verify "$source"` || die "'$source' is not a valid source";
chomp($srcsha);
my $tgtsha = `git rev-parse -q --verify "$target"` || die "'$target' is not a valid target";
chomp($tgtsha);

# %seen stores the commits seen so far, linked to the child we are interested in
my %seen = ();
$seen{$tgtsha} = "";

# @stack lists the commits to visit
my @stack = ();
push @stack, $tgtsha;


# print_path : print the path from '$target' down to '$source'
sub print_path {
  my ($source) = @_;

  my @path = ();

  my $sha = $source;
  while ($sha) {
    unshift @path, $sha;
    $sha = $seen{$sha};
  }

  print "$_\n" for @path;
}


# main body :
# as long as there is something to scan, go for it,
# if $source is found along the way, print the path and exit with success
# otherwise, end the loop, and exit with failure

while( scalar(@stack) > 0 ) {
  my $sha = shift @stack;

  # extract parent lines from 'git cat-file -p commit'
  my @parents = `git cat-file -p $sha | grep '^parent ' | cut -c8-`;
  
  foreach my $p (@parents) {
    chomp($p);
    # for each parent, if not seen yet :
    #   * store it as a parent of $p
    #   * put it on the list of commits to explore next
    if (!$seen{$p}) {
      $seen{$p} = $sha;
      push @stack, $p;

      if ($p eq $srcsha) {
        # if we reached the 'source' commit : stop here
        print_path $p;
        exit 0;
      }
    }
  }
}

# no path found
exit 1;

नमूना उपयोग:

$ perl git-path.pl A B
175015a5a00bbb9ad2ee4de23254ace4dbc645eb # commit B
bc03512e6082badab86a00cd320d89339741bb7b
077f584c10852cbadeef6c48886fd600cab61aa6
cec6734db31a1053b1b71674671512e1fe1592b1
b1dd3c71e42ca421f306640d4f0fdc69a00aa2c7
778a504c718f30d0dc2c72a30c885f10847f46a8 # commit A
1
LeGEC 14 सितंबर 2020, 22:11