UPDATE² : Mit Git 2.23 (August 2019) gibt es einen neuen Befehl
git restore, der dies tut, siehe die akzeptierte Antwort .UPDATE : Dies wird ab Git 1.8.3 intuitiver funktionieren, siehe meine eigene Antwort .
Stellen Sie sich den folgenden Anwendungsfall vor: Ich möchte alle Änderungen in einem bestimmten Unterverzeichnis meines Git-Arbeitsbaums entfernen und alle anderen Unterverzeichnisse intakt lassen.
Ich kann
git checkout ., aber git checkout. Fügt Verzeichnisse hinzu, die durch spärliches Auschecken ausgeschlossen sindEs gibt
git reset --hard, aber ich kann es nicht für ein Unterverzeichnis tun:> git reset --hard . fatal: Cannot do hard reset with paths.Nochmals: Warum kann git keine Hard / Soft-Resets nach Pfad durchführen?
Ich kann den aktuellen Status mithilfe von umgekehrt patchen
git diff subdir | patch -p1 -R, aber dies ist eine ziemlich seltsame Art, dies zu tun.
Was ist der richtige Git-Befehl für diese Operation?
Das folgende Skript veranschaulicht das Problem. Fügen Sie den richtigen Befehl unter dem How to make filesKommentar ein. Der aktuelle Befehl stellt die Datei wieder her, a/c/acdie beim Auschecken mit geringer Dichte ausgeschlossen werden soll. Beachten Sie, dass ich nicht explizit wiederherstellen möchte a/aund a/bich nur "weiß" aund alles unten wiederherstellen möchte. EDIT : Und ich "weiß" auch nicht b, oder welche anderen Verzeichnisse sich auf der gleichen Ebene befinden wie a.
#!/bin/sh
rm -rf repo; git init repo; cd repo
for f in a b; do
for g in a b c; do
mkdir -p $f/$g
touch $f/$g/$f$g
git add $f/$g
git commit -m "added $f/$g"
done
done
git config core.sparsecheckout true
echo a/a > .git/info/sparse-checkout
echo a/b >> .git/info/sparse-checkout
echo b/a >> .git/info/sparse-checkout
git read-tree -m -u HEAD
echo "After read-tree:"
find * -type f
rm a/a/aa
rm a/b/ab
echo >> b/a/ba
echo "After modifying:"
find * -type f
git status
# How to make files a/* reappear without changing b and without recreating a/c?
git checkout -- a
echo "After checkout:"
git status
find * -type f
git checkout -- /path/to/subdir/?
git stashakzeptiert kein
git stash && git stash drop?