web-dev-qa-db-fra.com

gitignore et "Les fichiers suivants de l'arborescence de travail non suivis seraient écrasés par la vérification"

J'ai donc ajouté un dossier à mon fichier .gitignore.

Une fois que je fais un git status il me dit

# On branch latest
nothing to commit (working directory clean)

Cependant, lorsque j'essaie de changer de branche, je reçois ce qui suit:

My-MacBook-Pro:webapp marcamillion$ git checkout develop
error: The following untracked working tree files would be overwritten by checkout:
    public/system/images/9/thumb/red-stripe.jpg
    public/system/images/9/original/red-stripe.jpg
    public/system/images/8/thumb/red-stripe-red.jpg
    public/system/images/8/original/red-stripe-red.jpg
    public/system/images/8/original/00-louis_c.k.-chewed_up-cover-2008.jpg
    public/system/images/7/thumb/red-stripe-dark.jpg
    public/system/images/7/original/red-stripe-dark.jpg
    public/system/images/7/original/DSC07833.JPG
    public/system/images/6/thumb/red-stripe-bw.jpg
    public/system/images/6/original/website-logo.png
    public/system/images/6/original/red-stripe-bw.jpg
    public/system/images/5/thumb/Guy_Waving_Jamaican_Flag.jpg
    public/system/images/5/original/logocompv-colored-squares-100px.png
    public/system/images/5/original/Guy_Waving_Jamaican_Flag.jpg
    public/system/images/4/thumb/DSC_0001.JPG
    public/system/images/4/original/logo.png
    public/system/images/4/original/DSC_0001.JPG
    public/system/images/4/original/2-up.jpg
    public/system/images/3/thumb/logo2.gif
    public/system/images/3/original/logo2.gif
    public/system/images/3/original/Guy_Waving_Jamaican_Flag.jpg
    public/system/images/3/original/11002000962.jpg
    public/system/images/2/thumb/Profile Pic.jpg
    public/system/images/2/original/Profile Pic.jpg
    public/system/images/2/original/02 Login Screen.jpg
    public/system/images/1/original/Argentina-2010-World-Cup.jpg
Please move or remove them before you can switch branches.
Aborting

Voici à quoi ressemble mon fichier .gitignore:

.bundle
.DS_Store
db/*.sqlite3
log/*.log
tmp/**/*
public/system/images/*
public/system/avatars/*

Comment puis-je faire en sorte que je puisse changer de branche sans supprimer ces fichiers?

Si j'apporte une modification, cela affectera-t-il ces fichiers? En d'autres termes, si je revenais dans cette branche par la suite, tout serait-il parfait jusqu'à mon dernier commit?

Je ne veux pas perdre ces fichiers, je ne veux tout simplement pas qu'ils soient suivis.

731
marcamillion

Il semble que vous souhaitiez que les fichiers soient ignorés, mais ils ont déjà été validés. .gitignore n’a aucun effet sur les fichiers déjà présents dans le référentiel, il est donc nécessaire de les supprimer avec git rm --cached. Le --cached l'empêchera d'avoir un effet sur votre copie de travail et sera simplement marqué comme supprimé lors de votre prochaine validation. Une fois les fichiers supprimés du référentiel, le .gitignore empêchera leur ajout.

Mais vous avez un autre problème avec votre .gitignore, vous utilisez excessivement des caractères génériques et cela le fait correspondre moins bien que prévu. Au lieu de cela, changeons le .gitignore et essayons ceci.

.bundle
.DS_Store
db/*.sqlite3
log/*.log
tmp/
public/system/images/
public/system/avatars/
232
Arrowmaster

ATTENTION: cela supprimera les fichiers non suivis, ce n'est donc pas une bonne réponse à la question posée.

Je frappe aussi ce message. Dans mon cas, je ne voulais pas conserver les fichiers, donc cela a fonctionné pour moi:

git 2.11 et plus récent

git clean  -d  -f .

vieux git

git clean  -d  -f ""

Si vous souhaitez également supprimer les fichiers ignorés par git, exécutez la commande suivante. 

ÊTRE AVERTI!!! CELA PROBABLEMENT DETRUIRE VOTRE PROJET, UTILISER UNIQUEMENT SI VOUS SAVEZ À 100% CE QUE VOUS FAITES

git 2.11 et plus récent

git clean  -d  -fx .

vieux git

git clean  -d  -fx ""

http://www.kernel.org/pub/software/scm/git/docs/git-clean.html

  • -x signifie que les fichiers ignorés sont également supprimés, ainsi que les fichiers inconnus de git.

  • -d signifie supprimer les répertoires non suivis en plus des fichiers non suivis. 

  • -f est requis pour le forcer à s'exécuter.

911
Scott Schafer

Attention: Ceci supprimera les fichiers locaux non indexés

Il suffit de le forcer: git checkout -f another-branch

518
Régis

Si vous utilisez OS X, c'est peut-être parce que le nom d'un fichier a vu certains caractères changer de casse. Essayez de définir l’option de configuration suivante:

git config core.ignorecase true
122
mattbasta

Git vous dit qu'il veut créer des fichiers (nommé public/system/images/9/... etc.), mais vous avez déjà des fichiers existants dans ce répertoire que are - suivis par Git. Peut-être que quelqu'un d'autre a ajouté ces fichiers au référentiel Git, et que c'est la première fois que vous passez à cette branche?

Il y a probablement une raison pour laquelle ces fichiers se trouvent dans votre branche develop mais pas dans votre branche actuelle. Vous devrez peut-être demander à vos collaborateurs pourquoi.

comment puis-je faire en sorte que je puisse changer de branche sans supprimer ces fichiers?

Vous ne pouvez pas le faire sans faire disparaître les fichiers. Vous pouvez renommer public en my_public ou quelque chose pour le moment.

si je revenais dans cette branche par la suite, tout serait-il parfait jusqu'à mon dernier engagement?

Si vous validez vos modifications, Git ne les perdra pas. Si vous ne validez pas vos modifications, alors Git essaiera très fort pas de remplacer le travail que vous avez effectué. C'est ce dont Git vous avertit au début (lorsque vous avez essayé de changer de branche).

41
Greg Hewgill

Il existe une commande pour cette tâche délicate (suppression permanente des fichiers non suivis)

git clean -i

Alors git pull fera l'affaire.

21
Abhishek Goel

Cela a fonctionné pour moi.

 1. git fetch --all
 2. git reset --hard Origin/{branch_name}
14
Chamara Jayalath

Malheureusement, ni git rm --cached ni git clean -d -fx "" ne l’ont fait pour moi.

Ma solution a finalement consisté à pousser ma branche vers la télécommande, à cloner un nouveau référentiel, puis à fusionner le nouveau référentiel. Les autres personnes accédant à la pension devaient faire la même chose.

Morale de l'histoire: utilisez un fichier .gitignore depuis le début.

11
Kyle Clegg

Pour ceux qui ont besoin de quelque chose de moins ambitieux que la réponse de Scott Schafer ,

git clean -f

va probablement travailler. Je fortement suggère de courir

git clean --dry-run

premier. Cette commande affichera une liste de fichiers que Git supprimera si vous exécutez git clean -f, et vous épargnera peut-être la peine de supprimer par inadvertance quelque chose que vous ne voudriez pas.

Voir cette réponse Stack Oveflow ou la documentation pour plus d'informations sur git clean.

10
mc_kaiser

Si vous voulez résoudre rapidement cette question, vous pouvez utiliser cette commande:

git checkout -f dev
9
GeekHades

Cela m'est arrivé sur un système Windows 8 , en utilisant Git à partir de la commande Invite. Le reste de mon équipe utiliseTFS, et j'utilise le git-tf de Microsoft pour Push/Pull entre TFS et mon référentiel Git local.

Le problème est dû à certains fichiers qui ont été renommés uniquement pour changer leur cas . Ce qui semble être arrivé est le suivant:

  • Les fichiers ont été archivés avec des boîtiers mixtes dans leurs noms.
  • Dans une validation ultérieure, les noms de fichier ont été modifiés en minuscules.
  • git-tf a initialement obtenu les fichiers en casse mixte.
  • Lorsque les fichiers ont été renommés en minuscules, git-tf ne les a pas récupérés car, sous Windows 8, ces noms de fichiers sont équivalents.
  • Comme Git est sensible à la casse, il s’est plaint du fait que j’avais les fichiers à casse mixte qui ne relevaient pas du contrôle de source. Mais avec git status, je n’ai pu voir aucun changement, car dans la commande Windows, Invite, ces noms de fichiers sont équivalents.

La solution la plus simple pour moi était:

  • git checkout une version précédente du projet, bien avant l’ajout de ces fichiers .
  • Puisgit checkout la dernière version du projet, avec le fichier d’archivage correct.
8
Ryan Lundy

J'ai eu le même problème lors de la vérification d'une branche basée sur un commit précédent. Git a refusé de passer à la caisse à cause de fichiers non suivis.

J'ai trouvé une solution et j'espère que cela vous aidera aussi.

Ajouter les répertoires affectés à .gitignore et leur donner $ git rm -r --cached n'est apparemment pas suffisant. 

Supposons que vous souhaitiez créer une branche basée sur un commit K antérieur afin de tester des éléments et de revenir à la version actuelle. Je le ferais dans les étapes suivantes:

  1. Configurez les fichiers non suivis: Éditez le .gitignore et appliquez $ git rm -r --cached aux fichiers et répertoires que vous voulez que le git ignore. Ajoutez également le fichier .gitignore lui-même à .gitignoreet n'oubliez pas d'émettre $ git rm -r --cached .gitignore. Cela garantira que le comportement ignorer de git laisse la même chose dans les premiers commits.

  2. Validez les modifications que vous venez de faire:

    $ git add -A
    $ git commit

  3. Enregistrez le journal actuel, sinon vous pourriez avoir des problèmes pour revenir à la version actuelle.

    $ git log > ../git.log

  4. Réinitialisation matérielle à la validation K 

    $ git reset --hard version_k

  5. Créer une branche basée sur le commit K

    $ git branch commit_k_branch

  6. Commander dans cette branche

    $ git checkout commit_k_branch 

  7. Fais tes affaires et commets-les

  8. Revenez dans Master encore

    $ git checkout master

  9. Réinitialiser à la version actuelle

    $ git reset current_version ou $ git reset ORIG_HEAD

  10. Maintenant, vous pouvez réinitialiser dur à la tête

    git reset --hard HEAD

REMARQUE! Ne sautez pas l’avant-dernière étape (comme par exemple, $ git reset --hard ORIG_HEAD), Sinon les fichiers non suivis réclamés ci-dessus seront perdus.

Je me suis également assuré que les fichiers dont git se plaint n'étaient pas supprimés. Je les ai copiées dans un fichier texte et ai lancé la commande $ for i in $(cat ../test.txt); do ls -ahl $i; done

Si vous passez à la succursale mentionnée ci-dessus, n'oubliez pas de publier $ git status pour vous assurer qu'aucune modification indésirable n'apparaîtra.

7
Juri Sinitson

Dans mon cas, le problème était avec les sous-modules. master a été fusionné avec une autre branche, ce qui a ajouté un nouveau sous-module au projet. La branche que j'essayais de vérifier ne l'avait pas, c'est pourquoi git se plaignait des fichiers non suivis et qu'aucune des solutions suggérées ne fonctionnait pour moi. J'ai forcé la caisse à ma nouvelle succursale et ai tiré le maître.

  • git checkout -f my_branch
  • git pull Origin master
  • git submodule update --init
4
Bruno Pinheiro

Ces deux fonctions (git rm --cached, Git checkout -f une autre branche) ne fonctionnaient PAS pour moi.

Au lieu de cela, j'ai physiquement supprimé le fichier (dans Eclipse) comme ce que Git vous avait demandé de faire; S'il vous plaît déplacer ou les supprimer avant de pouvoir changer de branche.

et puis j'ajoute/commis.

et puis j'ai tiré et cela a fonctionné!

3
In-young Choung

J'étais également confronté à un problème similaire et j'ai essayé toutes les solutions affichées ci-dessus, mais cela n'a pas fonctionné

Le problème était dû au fait que je ai renommé mon onMusicUpdateListener.Java en OnMusicUpdateListener.Java dans la branche develop

Maintenant, master avait onMusicUpdateListener.Java Et develop avait le même fichier que OnMusicUpdateListener.Java

Maintenant, chaque fois que je passais à maîtriser cela me donnait une erreur

The following untracked working tree files would be overwritten by checkout

et puis il aborted.

Afin de résoudre ce problème, je force de force checked outmaster branch Puis je renomme mon onMusicUpdateListener.Java en OnMusicUpdateListener.Java, committed le, puis merged le avec develop branche.

Ensuite, j'ai mis à jour ma branche develop de merging dans master et maintenant tout est revenu à la normale et le problème a été résolu.

3

Déplacer des fichiers au lieu de supprimer

Une façon d'éviter de supprimer des fichiers consiste à les déplacer à la place. Par exemple:

cd "`git rev-parse --show-toplevel`"
git checkout 2>&1 | while read f; do [ ! -e "$f" ] || mv "$f" "$f".bak; done
2
gmatht

Cela pourrait être un problème de permission,

changer la propriété,

Sudo chown -v -R usr-name:group-name folder-name
2
Won Jun Bae

Dans mon cas, git rm --cached n'a pas fonctionné . Mais je l'ai eu avec un git rebase

2
Hillkorn

Le problème concerne 2 fichiers portant le même nom mais avec un cas différent.

Vous pouvez en supprimer un sur ces fichiers ou le renommer. Ex:

Pdf.html.twig (The GOOD one)

pdf.html.twig (The one I deleted)
2
Samuel Vicent

Si vous avez renommé un fichier localement, puis effectuez une pull, ce message d'erreur s'affichera. 

1
lyuboslav kanev

c'est facile à résoudre, git dit que vous avez les mêmes fichiers dans les deux branches, vous devez donc supprimer les fichiers spécifiques de la branche maître et ensuite vous pourrez fusionner:

git fusionner "votre branche"

J'espère que cela fonctionne pour vous, je viens de résoudre mon erreur ..__ mon erreur était:

erreur: les fichiers d’arbre de travail non suivis suivants seraient écrasés par la fusion: .vs/slnx.sqlite S'il vous plaît déplacez ou supprimez-les avant de fusionner . Abandonner

Maintenant, ça marche! Dans mon cas, le fichier .vs/slnx.sqlite a été généré par Visual Studio, je devais le fermer avant de le supprimer.

1
jeirueda

La plupart des réponses envisagent de supprimer ou de supprimer les fichiers, ce qui est facile. Mais parfois, vous ne voulez pas vous débarrasser des fichiers locaux. Mais fusionner avec une stratégie, git a donc une solution à cela aussi;

git merge --strategy=ours master 
0
Erdinç Çorbacı

Dans mon cas, je voyais cette erreur parce que j'utilisais un CMS populaire open source et que le répertoire qui posait problème était le répertoire de téléchargement dans lequel le CMS écrit.

Donc, ce qu'il disait, c'est qu'il existe des fichiers que vous n'avez pas, mais que vous ne pouvez pas obtenir du versioning.

J'attrape tous les fichiers du site actif sur mon local, puis je l'examinerai dans le référentiel dans l'espoir que cela résoudra le problème.

0
Markosaurus

Vérifiez si un nom de dossier avec '/' ou un symbole spécial est renommé, puis renommez-le. Ensuite, il vous suffit de cloner le référentiel vers un autre emplacement.

0
Codemaker

Supprimez simplement les fichiers ou renommez-les.

par exemple. 

$ git pull
Enter passphrase for key '/c/Users/PC983/.ssh/id_rsa':
error: Your local changes to the following files would be overwritten by merge:
        ajax/productPrice.php
Please commit your changes or stash them before you merge.
error: The following untracked working tree files would be overwritten by merge:
        ajax/product.php
Please move or remove them before you merge.
Aborting
Updating a04cbe7a..6aa8ead5

Je devais renommer/supprimer ajax/product.php et ajax/produtPrice.php .

Ne vous inquiétez pas, Git Pull les ramènera. Je vous suggère de les renommer au lieu de les supprimer, car vous risquez de perdre certaines modifications.

Si cela ne vous aide pas, vous devez alors supprimer toute la branche, la créer à nouveau et ensuite faire git pull Origin remotebranch

0
Black

Supprimez .gitignore fichier de appname/gen/pour résoudre ce problème.

0
vishnuc156

Afin de sauvegarder les fichiers modifiés et d’utiliser le contenu modifié plus tard ... J'ai trouvé cette erreur alors que j'essayais de vérifier une branche et d’essayer de rebaser. 

git stash

Je suis juste allé dans le système de fichiers et ai supprimé le fichier directement, puis j'ai continué avec git checkout et cela a fonctionné.

Le problème est survenu plusieurs fois et peut être lié au fait que des développeurs suppriment, Push, rajoutent, Push ou quelque chose du genre.

0
Phil Carter