web-dev-qa-db-fra.com

Appliquez gitignore sur un référentiel existant effectuant déjà le suivi d'un grand nombre de fichiers

J'ai un projet Visual Studio existant dans mon référentiel. J'ai récemment ajouté un fichier .gitignore dans mon projet et je suppose que cela indique à Git d'ignorer les fichiers répertoriés dans le fichier. 

Mon problème est que tous ces fichiers font déjà l'objet d'un suivi et que je sache, Git n'ignorera pas un fichier qui avait déjà été suivi avant qu'une règle ne soit ajoutée à ce fichier pour l'ignorer.

Il a été suggéré d'utiliser: git rm --cached et de les dépiler manuellement, mais cela me prendra une éternité pour les parcourir un à un. 

J'ai pensé à supprimer le référentiel et à le recréer à nouveau, mais cette fois avec le fichier .gitignore présent, mais il doit y avoir un meilleur moyen de le faire.

229
Tohid

Cette réponse a résolu mon problème:

Tout d’abord, commit toutes les modifications en attente.

Puis lancez cette commande:

git rm -r --cached .

Cela supprime tout de l'index, puis lancez simplement:

git add .

Engagez-le:

git commit -m ".gitignore is now working"
640
Tohid
  1. Créez un fichier .gitignore. Pour ce faire, vous créez simplement un fichier .txt vierge.

  2. Ensuite, vous devez changer son nom en écrivant la ligne suivante sur la cmd (où git.txt est le nom du fichier que vous venez de créer):

    rename git.txt .gitignore

  3. Ensuite, vous pouvez ouvrir le fichier et écrire tous les fichiers non suivis que vous souhaitez ignorer définitivement. Par exemple, le mien ressemble à ceci:

`` `

OS junk files
[Tt]humbs.db
*.DS_Store

#Visual Studio files
*.[Oo]bj
*.user
*.aps
*.pch
*.vspscc
*.vssscc
*_i.c
*_p.c
*.ncb
*.suo
*.tlb
*.tlh
*.bak
*.[Cc]ache
*.ilk
*.log
*.lib
*.sbr
*.sdf
*.pyc
*.xml
ipch/
obj/
[Bb]in
[Dd]ebug*/
[Rr]elease*/
Ankh.NoLoad

#Tooling
_ReSharper*/
*.resharper
[Tt]est[Rr]esult*

#Project files
[Bb]uild/

#Subversion files
.svn

# Office Temp Files
~$*

Il y a une collection complète de fichiers .gitignore utiles par GitHub

  1. Une fois que vous avez cela, vous devez l'ajouter à votre référentiel git, comme tout autre fichier, mais il doit être à la racine du référentiel.

  2. Ensuite, dans votre terminal, vous devez écrire la ligne suivante:

    git config --global core.excludesfile ~/.gitignore_global

De la doc officielle:

Vous pouvez également créer un fichier global .gitignore, qui est une liste de règles pour ignorer les fichiers de chaque référentiel Git sur votre ordinateur. Pour Par exemple, vous pouvez créer le fichier dans ~/.gitignore_global et ajouter du règles à elle.

Terminal ouvert. Exécutez la commande suivante dans votre terminal: git config --global core.excludesfile ~/.gitignore_global

Si le référentiel existe déjà, vous devez exécuter ces commandes:

git rm -r --cached .
git add .
git commit -m ".gitignore is now working"

Si l’étape 2 ne fonctionne pas, écrivez le chemin des fichiers que vous souhaitez ajouter.

49
SomeAnonymousPerson

Comme spécifié ici Vous pouvez mettre à jour l'index:

git update-index --assume-unchanged /path/to/file

En faisant cela, les fichiers ne seront pas affichés dans git status ou git diff.

Pour recommencer à suivre les fichiers, vous pouvez exécuter:

git update-index --no-assume-unchanged /path/to/file
28

Voici un moyen de «désencombrer» tous les fichiers qui seraient autrement ignorés sous l'ensemble actuel de modèles d'exclusion:

(GIT_INDEX_FILE=some-non-existent-file \
git ls-files --exclude-standard --others --directory --ignored -z) |
xargs -0 git rm --cached -r --ignore-unmatch --

Cela laisse les fichiers dans votre répertoire de travail mais les supprime de l'index.

Le truc utilisé ici est de fournir un fichier d’index inexistant à git ls-files afin qu’il pense qu’il n’ya pas de fichiers suivis. Le code Shell ci-dessus demande tous les fichiers qui seraient ignorés si l'index était vide, puis les supprime de l'index actuel avec git rm.

Une fois les fichiers «décompressés», utilisez le statut git pour vérifier que rien d’important n’a été supprimé (si tel est le cas, réglez vos modèles d’exclusion et utilisez git reset - path pour restaurer l’entrée d’index supprimée). Ensuite, faites un nouveau commit qui laisse de côté le "crud".

Le "crud" sera toujours dans n'importe quel vieux commet. Vous pouvez utiliser git filter-branch pour produire des versions propres des anciens commits si vous avez vraiment besoin d'un historique vierge (si vous utilisez un git filter-branch, vous «réécrivez l'historique». Il ne faut donc pas le prendre à la légère si des collaborateurs ont l’un de vos commits historiques après la création du «crud»).

1
user2474948

Si vous avez ajouté votre .gitignore trop tard, git continuera malgré tout à suivre les fichiers déjà validés. Pour résoudre ce problème, vous pouvez toujours supprimer toutes les instances mises en cache des fichiers indésirables.

Tout d’abord, pour vérifier quels fichiers suivez-vous réellement, vous pouvez exécuter:

git ls-tree --name-only --full-tree -r HEAD

Disons que vous avez trouvé des fichiers indésirables dans un répertoire tel que cache/, il est donc préférable de cibler ce répertoire plutôt que tous vos fichiers.

Donc au lieu de:

git rm -r --cached .

Il est préférable de cibler le fichier ou le répertoire indésirable:

git rm -r --cached cache/

Ensuite, ajoutez toutes les modifications, 

git add .

et commettre ...

git commit -m ".gitignore is now working"

Référence: https://amyetheredge.com/code/13.html

1
Eli Nunez

Je pense que c’est un moyen facile d’ajouter un fichier .gitignore à un référentiel existant.

Prérequis:

Vous avez besoin d’un navigateur pour accéder à votre compte github.

Pas

  1. Créez un nouveau fichier dans votre projet requis (existant) et nommez-le .gitignore. Vous obtiendrez une invite suggestive pour les modèles .gitignore dès que vous aurez nommé le fichier .gitignore. Utilisez ces modèles ou utilisez gitignore.io pour générer le contenu de votre fichier gitignore.
  2. Commettez les modifications.
  3. Maintenant, clonez ce référentiel.

S'amuser!

0
Roshan Poudyal