UPDATE² : Avec Git 2.23 (août 2019), il y a une nouvelle commande
git restore
qui fait cela, voir la réponse acceptée .MISE À JOUR : Cela fonctionnera plus intuitivement à partir de Git 1.8.3, voir ma propre réponse .
Imaginez le cas d'utilisation suivant: Je veux me débarrasser de toutes les modifications dans un sous-répertoire spécifique de mon arbre de travail Git, en laissant tous les autres sous-répertoires intacts.
Je peux le faire
git checkout .
, mais git checkout. ajoute des répertoires exclus par une extraction clairseméeIl y en a
git reset --hard
, mais ça ne me laissera pas le faire pour un sous-répertoire:> git reset --hard . fatal: Cannot do hard reset with paths.
Encore une fois: pourquoi git ne peut pas effectuer de réinitialisations matérielles / logicielles par chemin d'accès?
Je peux inverser la correction de l'état actuel en utilisant
git diff subdir | patch -p1 -R
, mais c'est une façon plutôt étrange de le faire.
Quelle est la commande Git appropriée pour cette opération?
Le script ci-dessous illustre le problème. Insérez la commande appropriée sous le How to make files
commentaire - la commande en cours restaurera le fichier a/c/ac
qui est censé être exclu par la vérification clairsemée. Notez que je ne veux pas restaurer explicitement a/a
et a/b
, je "connais" seulement et je a
veux tout restaurer ci-dessous. EDIT : Et je ne sais pas non plus b
, ni quels autres répertoires résident au même niveau que 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 stash
n'accepte pas d'argument de chemin ...
git stash && git stash drop
?