utiliser gitignore pour ignorer (mais pas supprimer) les fichiers


98

J'ai un répertoire tmp dans mon repo git que j'aimerais toujours exister, mais je suis ignoré. Je l'ai ajouté à .gitignore, mais git statusm'indique toujours les modifications apportées aux fichiers dans ce répertoire. J'ai essayé git rm -r --cached, mais cela le supprime du repo distant. Comment puis-je arrêter le suivi des modifications apportées à ce répertoire, tout en l'autorisant à exister? Je dois également le faire pour 1 fichier, mais les modifications apportées à cela apparaissent également git statusaprès .gitignoreles avoir. Que devrais-je faire?


1
Veuillez noter à quoi ressemble exactement votre fichier .gitignore?
kdehairy

Réponses:


183

Au lieu de .gitignore, vous pouvez mettre à jour le référentiel git local en exécutant la commande suivante:

git update-index --assume-unchanged <file>

Dans ce cas, un fichier est suivi dans le dépôt d'origine. Vous pouvez le modifier dans votre dépôt local et git ne le marquera jamais comme modifié. Lire la suite sur:


22
Mon amour pour git vient peut-être de doubler.
Mark Fox

2
Cela devrait être la réponse acceptée. Merci d'avoir créé un lien vers cela.
Gowiem

4
Existe-t-il un moyen de pousser cela vers le dépôt distant?
Brian Ortiz

2
hmm je préfère marquer un fichier comme "ce n'est pas un fichier git, ne le synchronisez jamais avec git, même dans un autre
dépôt

11
Vous pouvez le rétablir avec git update-index --no-assume-unchanged <file>. Si vous souhaitez les lister git ls-files -v | grep '^h'.
Sanghyun Lee

12

Ignorer les modifications apportées aux fichiers tout en leur permettant d'exister est le but exact de .gitignore. Donc, ajouter les fichiers (ou répertoires) .gitignoreest la seule chose que vous ayez à faire.

Mais votre problème est que git suit déjà les fichiers que vous souhaitez ignorer et .gitignorene s'applique pas aux fichiers suivis. La seule façon d'arrêter ce suivi est de dire à git de les supprimer. En utilisant git rm --cached, vous empêchez git de supprimer vos fichiers locaux, mais tout autre référentiel recevant vos modifications appliquera la suppression. Je ne pense pas qu'il existe un moyen d'éviter cela à partir de votre propre référentiel. Vous devez faire quelque chose sur les autres référentiels, ou accepter que les fichiers soient supprimés.

Pour empêcher la suppression de chaque autre référentiel, vous pouvez:

  • (évidemment) sauvegarder les fichiers quelque part, extraire les modifications et restaurer les fichiers,
  • ou aussi git rm --cachedles fichiers et validez avant d' extraire vos modifications. Git fusionnera joliment les deux suppressions sans toucher aux fichiers déjà non suivis.

6
Cela n'a pas à être vrai ("arrêter le suivi = supprimer le fichier"). Vous pouvez toujours avoir un fichier suivi dans une mise en pension et de ne pas voir toutes les modifications apportées, en utilisant: git update-index --assume-unchanged <file>. Jetez un œil à: blog.pagebakers.nl/2009/01/29/…
ducin

cela a résolu mon problème car je dois supprimer le fichier du dépôt poussé dans git git rm --cached <filename> -r et après cette poussée, il change à nouveau en repositorie afin que le fichier soit supprimé
Vinicius Cardoso

7

Mettez un /à la fin du nom du répertoire dans votre .gitignorefichier, c'est-à-dire

tmp/

Si vous avez suivi des fichiers dans ce répertoire, vous devez d'abord dire à git de les oublier (avant d'ajouter le répertoire à la liste des ignorés). En supposant que vous n'avez rien de vital là-dedans (c'est-à-dire que vous pouvez le rayer):

git rm -rf ./tmp/
git commit -m "untrack tmp dir"
mkdir tmp
echo tmp/ >> .gitignore
git add .gitignore ; git commit -m "add tmp/ to ignore list"

Les nouveaux fichiers dans ce répertoire ne seront pas suivis.

L' --cachedoption de git rmne fonctionne que sur l'index (plus ou moins de changements en attente). Cela n'a aucun effet sur l'arbre de travail ou l'état de ce qui a été suivi ou non.


Je l'ai. Les deux the/dir/etthe/dir/*
21312312

Hey Mat, si j'ai quelque chose comme / Media dans différents dossiers que j'aimerais ignorer, est-ce possible? Donc, comme / 1 / Media, / 2 / Media, jusqu'à 99?
Nic


1

On dirait que vous essayez de suivre un fichier (par exemple index.php), de l'ajouter à un référentiel distant, puis d'arrêter de regarder le suivi, tout en gardant le fichier dans le répertoire distant (c'est-à-dire qu'il reste index.phpinchangé sur le dépôt distant tout en le modifiant localement).

D'après ce que je comprends, git ne peut pas faire cela. Vous pouvez suivre un fichier ou non. Si vous suivez un fichier, il existe dans le référentiel distant et change lorsque vous validez des modifications. Si vous ne suivez pas un fichier, il n'existe pas dans le référentiel distant.

Comme il n'est pas possible de faire exactement ce que vous voulez avec git, il existe potentiellement d'autres solutions, en fonction de votre situation exacte. Par exemple, pourquoi ne souhaitez-vous pas index.phpmodifier à distance lorsque vous le modifiez localement? Y a-t-il des paramètres spécifiques à l'utilisateur dans le fichier? Si tel est le cas, vous pouvez faire:

cp index.php index_template.php
git rm --cached index.php

Maintenant, modifiez index_template.php pour qu'il soit tel que vous voulez qu'il apparaisse sur le référentiel distant. Ajoutez quelque chose à votre README pour dire aux utilisateurs de votre référentiel qu'une fois qu'ils l'ont cloné, ils doivent copier index_template.php dans index.php et le modifier en fonction de leurs besoins.

git add index_template.php
git add README
git commit -m 'added template index.php file'
git push

Quand quelqu'un clone votre repo, il doit créer le sien index.php. Vous avez fait , il est facile pour eux: il suffit de copier index_template.phpà index.phpet le réviser avec les paramètres spécifiques de l' ordinateur.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.