¿Cómo git resetear un subdirectorio?

ACTUALIZAR: Esto funcionará más intuitivamente a partir de Git 1.8.3, vermi propia respuesta.

Imagine el siguiente caso de uso: quiero deshacerme de todos los cambios en un subdirectorio específico de mi árbol de trabajo de Git, dejando intactos todos los demás subdirectorios.

puedo hacergit checkout . , peropago de git. agrega directorios excluidos por la compra dispersa

Ahi estagit reset --hard, pero no me deja hacerlo para un subdirectorio:

> git reset --hard .
fatal: Cannot do hard reset with paths.

Otra vez:¿Por qué git no puede hacer reinicios duros / suaves por ruta?

Puedo revertir el estado actual mediante parchesgit diff subdir | patch -p1 -R, pero esta es una forma bastante rara de hacer esto.

¿Cuál es el comando Git adecuado para esta operación?

La siguiente secuencia de comandos ilustra el problema. Inserte el comando apropiado debajo deHow to make files comentario - el comando actual restaurará el archivoa/c/ac que se supone que es excluido por el pago disperso. Tenga en cuenta que yono haga desea restaurar explícitamentea/a ya/b, Yo solo sé"a y quiere restaurar todo a continuación.EDITAR: Y yo tampoco "sé"b, o que otros directorios residen en el mismo nivel quea.

#!/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

Respuestas a la pregunta(8)

Su respuesta a la pregunta