untracked - global gitignore git




Comment faire en sorte que Git "oublie" un fichier qui a été suivi mais est maintenant dans.gitignore? (14)

Utilisez ceci quand:

1. Vous voulez extraire beaucoup de fichiers, ou

2. Vous avez mis à jour votre fichier gitignore

Lien source: http://www.codeblocq.com/2016/01/Untrack-files-already-added-to-git-repository-based-on-gitignore/

Supposons que vous ayez déjà ajouté / validé des fichiers dans votre référentiel git et que vous les ajoutiez ensuite à votre .gitignore; ces fichiers seront toujours présents dans votre index de référentiel. Nous verrons dans cet article comment nous en débarrasser.

Étape 1: Validez toutes vos modifications.

Avant de continuer, assurez-vous que toutes vos modifications sont validées, y compris votre fichier .gitignore.

Étape 2: Supprimer tout du référentiel

Pour effacer votre repo, utilisez:

git rm -r --cached .
  • rm est la commande remove
  • -r permettra le retrait récursif
  • –Cached ne supprimera que les fichiers de l'index. Vos fichiers seront toujours là.

La commande rm peut être impitoyable. Si vous souhaitez essayer ce qu'il fait auparavant, ajoutez l' --dry-run -n ou --dry-run pour tester le résultat.

Étape 3: Re-tout ajouter

git add .

Étape 4: S'engager

git commit -m ".gitignore fix"

Votre dépôt est propre :)

Poussez les modifications sur votre télécommande pour voir les modifications effectives également.

Il y a un fichier qui était suivi par git , mais maintenant le fichier est dans la liste .gitignore .

Cependant, ce fichier continue à s'afficher dans l' git status après l'avoir édité. Comment forcer un git à l'oublier complètement?


Ce qui n'a pas fonctionné pour moi

(Sous Linux), je voulais utiliser les messages ici suggérant les ls-files --ignored --exclude-standard | xargs git rm -r --cached ls-files --ignored --exclude-standard | xargs git rm -r --cached approche ls-files --ignored --exclude-standard | xargs git rm -r --cached . Cependant, (certains des) fichiers à supprimer avaient une nouvelle ligne / LF / \n incorporée dans leurs noms. Aucune des solutions:

git ls-files --ignored --exclude-standard | xargs -d"\n" git rm --cached
git ls-files --ignored --exclude-standard | sed 's/.*/"&"/' | xargs git rm -r --cached

faire face à cette situation (obtenir des erreurs sur les fichiers non trouvés).

Alors j'offre

git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached

Ceci utilise l'argument -z de ls-files et l'argument -0 de xargs pour prendre en charge correctement / correctement les caractères "méchants" dans les noms de fichiers.

Dans la page de manuel git-ls-files (1) , il est indiqué:

Lorsque l'option -z n'est pas utilisée, les caractères de tabulation, LF et barre oblique inversée dans les chemins d'accès sont représentés respectivement par \ t, \ n et \\.

Je pense donc que ma solution est nécessaire si les noms de fichiers contiennent l'un de ces caractères.

EDIT: On m'a demandé d'ajouter que --- comme toute commande de git rm --- ceci doit être suivi d'un commit pour rendre les suppressions permanentes, par exemple git commit -am "Remove ignored files" .


Déplacez ou copiez le fichier dans un emplacement sûr pour ne pas le perdre. Puis, récupérez le fichier et validez. Le fichier sera toujours affiché si vous revenez à l'un de ces commits précédents, ou à une autre branche où il n'a pas été supprimé. Cependant, dans tous les commits futurs, vous ne verrez plus le fichier. Si le fichier est dans le git ignore, alors vous pouvez le déplacer dans le dossier, et git ne le verra pas.


Faites les étapes suivantes en série, tout ira bien.

1. Supprimez les fichiers ajoutés par erreur du répertoire / storage . Vous pouvez utiliser la commande "rm -r" (pour linux) ou les supprimer en parcourant les répertoires.

2.ajoutez maintenant les fichiers / répertoires au fichier gitignore et enregistrez-le.

3. Maintenant, supprimez- les du cache git en utilisant ces commandes (s'il y a plusieurs répertoires, supprimez-les un par un en lançant plusieurs fois cette commande).

git rm -r --cached path-to-those-files

4. maintenant faites un commit et appuyez sur , utilisez ces commandes. Cela supprimera ces fichiers de git remote et empêchera git de suivre ces fichiers.

git add .
git commit -m "removed unnecessary files from git"
git push origin

J'ai aimé la réponse de JonBrave, mais j'ai des répertoires de travail assez confus qui engagent -a me fait un peu peur, alors voici ce que j'ai fait:

git config --global alias.exclude-ignored '! git fichiers-ls -z --ignored --exclude-standard | xargs -0 git rm -r --cached && git ls-files -z --ignored --exclude-standard | xargs -0 git stage && git stage .gitignore && git commit -m "nouveau gitignore et supprime les fichiers ignorés de l'index" '

le décomposer:

git ls-files -z --ignored --exclude-standard | xargs -0 git rm -r --cached 
git ls-files -z --ignored --exclude-standard | xargs -0 git stage 
git stage .gitignore 
git commit -m "new gitignore and remove ignored files from index"
  • supprimer les fichiers ignorés de l'index
  • stage .gitignore et les fichiers que vous venez de supprimer
  • commettre

J'utilise toujours cette commande pour supprimer ces fichiers non suivis. Sortie nette, style Unix, sur une ligne:

git ls-files --ignored --exclude-standard | sed 's/.*/"&"/' | xargs git rm -r --cached

Il répertorie tous vos fichiers ignorés, remplace chaque ligne de sortie par une ligne entre guillemets pour gérer les chemins contenant des espaces, et transmet tout à git rm -r --cached pour supprimer les chemins / fichiers / répertoires de l'index.


La réponse de Matt Fear était l'IMHO le plus efficace. Voici un script PowerShell permettant aux utilisateurs de Windows de supprimer uniquement les fichiers de leur dépôt Git qui correspondent à leur liste d'exclusion.

# Get files matching exclusionsfrom .gitignore
# Excluding comments and empty lines
$ignoreFiles =  gc .gitignore | ?{$_ -notmatch  "#"} |  ?{$_ -match  "\S"} | % {
                    $ignore = "*" + $_ + "*"
                    (gci -r -i $ignore).FullName
                }
$ignoreFiles = $ignoreFiles| ?{$_ -match  "\S"}

# Remove each of these file from Git 
$ignoreFiles | % { git rm $_}

git add .

La série de commandes ci-dessous supprimera tous les éléments de l'index Git (et non du répertoire de travail ou du référentiel local), puis mettra à jour l'index Git, tout en respectant git ignore. PS Index = Cache

Premier:

git rm -r --cached . 
git add .

Ensuite:

git commit -am "Remove ignored files"

Si vous ne souhaitez pas utiliser la CLI et travaillez sous Windows, une solution très simple consiste à utiliser TortoiseGit . Il comporte l'action "Supprimer (conserver la localisation)" dans le menu, qui fonctionne correctement.


déplacez-le, engagez-vous, puis remettez-le à l'intérieur. Cela a fonctionné pour moi dans le passé. Il existe probablement un moyen plus "gittier" pour accomplir cela.


.gitignore empêchera l'ajout de fichiers non suivis (sans l' add -f ) à l'ensemble de fichiers suivis par git, mais git continuera à suivre tous les fichiers déjà suivis.

Pour arrêter de suivre un fichier, vous devez le supprimer de l'index. Ceci peut être réalisé avec cette commande.

git rm --cached <file>

La suppression du fichier de la révision principale aura lieu lors de la prochaine validation.


DS_Store déjà engagé:

find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch

Ignorez-les par:

echo ".DS_Store" >> ~/.gitignore_global
echo "._.DS_Store" >> ~/.gitignore_global
echo "**/.DS_Store" >> ~/.gitignore_global
echo "**/._.DS_Store" >> ~/.gitignore_global
git config --global core.excludesfile ~/.gitignore_global

Enfin, engagez-vous!


git update-index fait le travail pour moi:

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

Remarque: cette solution est en fait indépendante sur .gitignore car gitignore ne concerne que les fichiers non suivis.

edit: Depuis que cette réponse a été postée, une nouvelle option a été créée et devrait être préférée. Vous devez utiliser --skip-worktree qui est destiné aux fichiers suivis modifiés que l'utilisateur ne veut plus valider, et conserver --assume-unchanged pour la performance afin d'empêcher git de vérifier le statut des gros fichiers suivis. Voir https://.com/a/13631525/717372 pour plus de détails ...


git ls-files --ignored --exclude-standard -z | xargs -0 git rm --cached
git commit -am "Remove ignored files"

Cela prend la liste des fichiers ignorés et les supprime de l'index, puis valide les modifications.







git-rm