Wie kann ich einen Index für einen Sparse Checkout mit lokalen Änderungen neu generieren?

Wie kann ich einen Index für einen Sparse Checkout mit lokalen Änderungen neu generieren?

Ich verwende Git mit Sparse Checkouts, um mit Teilmengen eines sehr großen monolithischen Repositorys zu arbeiten. Die Leistung ist mit Sparse Checkouts gut, ohne jedoch schrecklich.

Gelegentlich wird mein Index beschädigt (normalerweise ist die Git-Integration von Xcode die Grundursache, aber ich habe es auf verschiedene Arten gelöst).

Für einen normalen Arbeitsbaum ist das kein Problem, ich lösche einfach die Indexdatei und git resethabe möglicherweise einige bereitgestellte Änderungen vorgenommen, die auf „nicht bereitgestellt“ zurückgesetzt werden, aber im Allgemeinen verliere ich nichts Wichtiges.

Bei einem Sparse-Checkout git resetwird das Sparse-Manifest jedoch nicht von Grund auf berücksichtigt, und ich komme daher zu dem Schluss, dass alle Dateien im vollständigen Repository, die sich nicht im Arbeitsbaum befinden (also alles, was mein Sparse-Checkout ausgeschlossen hat), gelöscht worden sein müssen, wodurch ich mit einer enormen Liste „gelöschter“ Dateien zurückbleibe.

Die empfohlene Methode zum Zurücksetzen des Index mit Sparse-Checkout-Informationen (d. h. zum Festlegen der Skip-Worktree-Flags) besteht darin, aufzurufen. git read-tree -mu HEADDies erfordert jedoch, dass keine nicht bereitgestellten Änderungen vorhanden sind. Ich muss diese nicht bereitgestellten Änderungen behalten und kann sie weder festschreiben noch bereitstellen oder sonst etwas, da ich keinen Index habe (und angesichts aller „gelöschten“ Dateien würde es auch sehr lange dauern, sie auszuchecken, nur damit Git sie erneut löschen kann, sobald es erkennt, dass sie nicht im Sparse-Checkout sind).

Wenn ich bereit wäre, meine lokalen Änderungen zu verlieren, könnte ich stattdessen aufrufen git read-tree -m --reset HEAD, was funktioniert. Da das Ziel aber darin besteht, meine nicht festgeschriebenen Änderungen beizubehalten, ist das nicht wirklich ausreichend.

Antwort1

Die beste Lösung, die ich bislang gefunden habe, besteht darin, alle meine Änderungen an einen temporären Speicherort zu verschieben, auszuführen git read-tree -mu HEAD, dann alle von Git erstellten Dateien zu löschen und sie durch die ursprünglichen Änderungen zu ersetzen.

Das bedeutet zwar, dass ich warten muss, bis Git alle Sparse-Checkout-Dateien neu erstellt hat, aber zumindest muss ich nicht warten, bis Git alle anderen Dateien im Repo erstellt hat, die ich nicht auschecken möchte (was normalerweiseviellänger).

verwandte Informationen