Ignorer les fichiers modifiés (mais non validés) dans git?

186

Puis-je dire à git d'ignorer les fichiers modifiés (supprimés) mais ne devant pas être validés?

La situation est que j'ai un sous-répertoire dans le repo qui contient des éléments qui ne m'intéressent pas du tout, je l'ai donc supprimé pour éviter qu'il n'apparaisse dans les complétions automatiques et autres (dans l'EDI).

Mais maintenant, si j'ajoute ce dossier à .gitignore, rien ne change, tout est affiché comme supprimé par git status.

Y a-t-il un moyen de faire en sorte que git l'ignore de toute façon?

(Sinon, comme j'utilise git-svn, puis-je valider les modifications dans le git local et m'assurer qu'elles ne sont pas transmises au repo svn?)

Sam
la source
au lieu de simplement les marquer comme non modifiés dans l'index du référentiel, vous souhaiterez peut-être les supprimer complètement de l'index. Ainsi, tant que vous aurez toujours le fichier dans votre répertoire de travail, l'index du dépôt peut être entièrement supprimé, et git ne le verra même pas comme ayant existé du tout. Veuillez consulter le lien dans ma réponse ci-dessous.
MaurerPower

Réponses:

279

consultez la page de manuel git-update-index et le bit --assume-unchanged et associés.

quand j'ai ton problème je fais ça

git update-index --assume-unchanged dir-im-removing/

ou un fichier spécifique

git update-index --assume-unchanged config/database.yml
csmosx
la source
3
Pouvez-vous lister tous vos fichiers ignorés d'une manière ou d'une autre?
Zitrax
21
Vous pouvez récupérer les fichiers avecgit update-index --no-assume-unchanged config/database.yml
Denis Kniazhev
1
Voir la réponse de Dave L ci-dessous pour une solution plus récente sans certaines des lacunes de --assume-unchanged.
Ben Challenor
2
Est-il possible de l'ajouter au fichier de configuration du référentiel, au lieu d'exécuter cette commande manuellement à chaque fois?
Tim Boland
1
Sera-t-il modifié pour le prochain commit? Je ne veux pas que cela reste inchangé pour toujours.
Pranav Nandan
41

Une option plus récente et meilleure est git update-index --skip-worktreequi ne sera pas perdue lors d'une réinitialisation matérielle ou d'un nouveau changement à partir d'un pull.

Consultez la page de manuel à l' adresse http://schacon.github.com/git/git-update-index.html

Et une comparaison sur http://fallengamer.livejournal.com/93321.html

Dave L.
la source
9
Un inconvénient à noter est qu'une fois que les modifications d'un fichier ont été masquées skip-worktree, trouver ces fichiers est un peu fastidieux. Le seul moyen que je connaisse est git ls-files -v |grep -v '^H'. De plus, de nombreux outils GUI ne connaissent pas cette fonctionnalité et peuvent produire des erreurs amusantes si, par exemple, un checkoutéchoue à cause de fichiers modifiés "cachés".
sleske
Je n'ai jamais pu comprendre AUCUN des fichiers git doc. Donc ce n'est pas beaucoup d'aide. (Chaque fichier doc suppose que vous comprenez les subtilités de tous les autres fichiers doc!)
SMBiggs
9

Utilisez ce code

git update-index --assume-unchanged file-name
Sujiraj R
la source
1
Vraiment intéressant. Je dois utiliser un passord dans mon projet maven mais je ne veux pas le publier sur un référentiel git, donc je mets un espace réservé pour celui-ci sans valeur dans local, properties, je le valide, puis j'insère le mot de passe, mais marque le fichier inchangé avec la commande suggérée. Le mot de passe n'est donc pas publié.
Stefano Scarpanti
fonctionne parfaitement. +1
YTG le
6

Les fichiers suivis ne peuvent pas être ignorés, vous devrez donc d'abord les supprimer de votre index. Ajoutez un .gitignorequi ignore les répertoires que vous ne voulez pas, puis supprimez-les et supprimez tous les retardataires avec git rm --cached.

John Feminella
la source
1
Hm, j'essaye ceci, mais ensuite j'ai tous les fichiers répertoriés comme supprimés. Dois-je commettre cela et le --cached fera en sorte qu'il ne sera pas poussé vers les télécommandes? Ou ai-je eu qc. faux? Le plus important pour moi est de ne pas corrompre le dépôt distant (svn).
1
Vous ne pouvez rien commettre qui ne commence pas dans votre index. git rm - met en cache tout ce que vous ne voulez pas valider, puis ajoutez un fichier .gitignore localement contenant "*". Maintenant, peu importe combien vous ajoutez, vous ne verrez plus jamais ces fichiers dans votre index.
John Feminella
Ah, je pense que je comprends - mis en cache maintenant .. Cela ne fait que supprimer les trucs de l'index, et laisse l'arbre de travail seul .. Je ne sais pas si je manque quelque chose, mais AFAIS je cherche le contraire , en le supprimant de l'arborescence de travail sans toucher l'index .. Ou puis-je l'utiliser pour cela d'une manière ou d'une autre?
6

Ce que je fais habituellement, c'est

git stash

git quoi que ce soit d'autre

git stash apply

git stash clear

Walter
la source
11
fwiw vous pouvez aussi 'git stash pop' pour faire ces deux derniers à la fois (bien que 'git stash clear' effacera TOUTES les entrées de stash, si vous le souhaitez).
Groxx