Wenn ich einen flachen Klon, z.Wie kann ich die Tiefe des flachen Klons eines Git erkennen?
git clone --depth 10 http://foo.bar/baz.git
Hat git
jeden Befehl die Tiefe dieses Klons abzurufen? (z.B. ein Befehl, der einfach 10
druckt).
Wenn ich einen flachen Klon, z.Wie kann ich die Tiefe des flachen Klons eines Git erkennen?
git clone --depth 10 http://foo.bar/baz.git
Hat git
jeden Befehl die Tiefe dieses Klons abzurufen? (z.B. ein Befehl, der einfach 10
druckt).
Kurze Antwort: Nein. Die Nummer wird nirgends gespeichert (es sei denn, Sie speichern sie selbst - und es wäre nett, wenn Git sie irgendwo in .git/config
gespeichert hätte).
Ein Repository ist flach (von Git's interner Definition) wenn und nur wenn die Datei .git/shallow
existiert. Die Inhalte dieser Datei sind ein wenig hinterhältig: die meisten Git behandelt es genau wie .git/grafts
. Das heißt, jede Zeile in der Datei shallow
enthält eine Commit-Hash-ID (und nichts anderes, als grafts
, wobei auf jede Zeile alle verpflanzten Eltern-IDs folgen: Da die Zeile leer ist, gibt es keine Eltern-IDs und das Commit wird zu a Root-Commit). (Git kann es intern als "nicht wirklich ein root" kennzeichnen, was darauf hinweist, dass es Eltern hat, die einfach nie erhalten wurden. Um absolut zuverlässig zu sein, würde dies auch sicherstellen, dass keine tatsächlichen Root-Commit-IDs jemals in der Datei gespeichert werden , und ich bin mir nicht sicher, ob das der Fall ist.)
Sie könnten eine maximale Tiefe aller Referenzen berechnen: Beginnen Sie mit jedem Verweis, Graf Tiefe von diesem tippmost Commit hinunter zu einem (möglicherweise gepfropft) Wurzel. Dies wäre jedoch nicht notwendigerweise die Nummer, die an --depth
(hier oder später mit einer --depth
, erteilt an git fetch
) übergeben wurde.
Angenommen, wir klonen zum Beispiel ein Repository, das nur zwei Commits hat, während wir auch --depth 10
verwenden. Die tiefste Kette ist entweder ein oder zwei Commits lang, da es nur zwei Commits gibt: eine (echte) Wurzel für bestimmte und eine Commit, die die andere als ihre Eltern haben könnte, oder könnte eine andere (echte) Root-Commit sein. Wenn - das ist der Fall, weiß ich nicht die Antwort auf - die .git/shallow
Datei enthält nie echte Wurzeln, wäre es an dieser Stelle leer und wir würden wissen, dass, wie lange die längste Kette ist, das --depth
Argument größer als das sein muss , aber wir würden die tatsächliche Anzahl nicht wissen.
Angenommen, wir klonen auf der anderen Seite ein 10-oder-mehr-Commit-Repository mit unserem --depth 10
und erhalten eine Kette von 10 Commits, die durch ein gefälschtes Root-Graft beendet werden. Dann fügen wir zwei neue Commits zu dieser 10-langen Kette hinzu, so dass wir eine 12-Commit-Kette haben. Die --depth
ist immer noch 10, aber Ketten zählen, finden wir 12.
So zeigt dies zwei Möglichkeiten, dass eine berechnete Anzahl zu klein oder zu groß sein könnte. In vielen Fällen würde die berechnete Anzahl jedoch gut funktionieren. Um berechnete Zählungen zu erhalten, verwenden Sie git for-each-ref
, um jede Referenz zu finden, und git rev-list --count --first-parent
für jede gefundene Referenz. Was auch immer Sie erhalten, ist wahrscheinlich die Tiefenzahl, oder etwas nahe genug.