git - notes - team foundation server express 2018 download



Git-Finden eines Dateinamens von einem SHA1 (4)

Übergeben Sie die Datei und notieren Sie den sha1-Hash des Commit-Objekts. Danach verwenden

git ls-tree <commit-sha1>

und Sie erhalten die Namen der Dateien mit den Hashes.

Überprüfen Sie die Manpages für weitere Optionen.

https://ffff65535.com

Ich habe dem Index eine Datei hinzugefügt mit:

git add somefile.txt

Ich habe dann die SHA1 für diese Datei mit:

git hash-object somefile.txt

Ich habe jetzt eine SHA1 und ich möchte den Dateinamen des Objekts im Index mit dem SHA1 abrufen.

git show 5a5bf28dcd7944991944cc5076c7525439830122

Dieser Befehl gibt den Dateiinhalt, aber nicht den Namen der Datei zurück.

Wie bekomme ich den vollständigen Dateinamen und Pfad zurück von der SHA1?


Das folgende Shell-Skript basiert stark auf dem Commit mit diesem Blob? und die Antwort von Aristoteles Pagaltzis.

#!/bin/sh

obj_hash=$1

# go over all trees
git log --pretty=format:'%T %h %s' \
| while read tree commit subject ; do
     git ls-tree -r $tree | grep  "$obj_hash" \
     | while read a b hash filename ; do
        if [ "$hash" == "$obj_hash" ]; then
          f=$filename
          echo $f
          break
        fi
        if $f ; then break; fi
      done
      if $f; then break; fi
done

Ich bin mir sicher, dass jemand dieses Skript verschönern könnte, aber es funktioniert. Die Idee ist, alle Bäume zu betrachten und nach Ihrem spezifischen Hash zu suchen.


Toller One-Liner, um dies zu tun:

git rev-list --objects --all | grep <blob sha1>

git rev-list <commit-list> enthält keine Commits, die zum Beispiel von rebase -i entfernt wurden und nun nur reflog referenziert werden. Wenn also blob nicht per Befehl gefunden wird, sollten Sie auch reflog überprüfen, zB so:

git reflog --all | \
cut -d\  -f1 | \
xargs -n1 -iX sh -c "git ls-tree -r X | grep <BLOB_SHA> && echo X"




sha1