.gitignore et «Les fichiers d'arborescence de travail non suivis suivants seraient écrasés lors du paiement»


828

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

Une fois que je fais git statusça, ça me dit

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

Cependant, lorsque j'essaie de changer de branche, j'obtiens 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 ensuite dans cette branche, tout serait parfait jusqu'à mon dernier commit?

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


10
si vous ne vous souciez vraiment pas de ces fichiers: git checkout -f <branch> dans mon cas, les fichiers sont générés dans le processus de construction, donc je m'en fous de tout
Hobbamok

Cela se produit parfois si vous effectuez un "git checkout" (sans nom de branche). Pour corriger, faites 'git checkout branchname'
crafter

Question distincte mais étroitement liée: pourquoi cette erreur se produit-elle? pourquoi ne peut-il pas simplement basculer entre les branches?
ahnbizcad

@ahnbizcad Parce que si vous travailliez sur un nouveau fichier et que quelqu'un sur une autre branche commettait un fichier du même nom, vous seriez énervé si git mettait votre version à la poubelle lorsque vous changiez de branche. C'est pourquoi le drapeau -f est là.
Matthew Sharp

Réponses:


264

Il semble que vous souhaitiez ignorer les fichiers, mais ils ont déjà été validés. .gitignore n'a aucun effet sur les fichiers qui sont déjà dans le référentiel, ils doivent donc être supprimés avec git rm --cached. Le --cachedempêcherai d'avoir un effet sur votre copie de travail et il marquera aussi supprimé la prochaine fois que vous vous engagez. Une fois les fichiers supprimés du référentiel, le .gitignore les empêchera d'être ajoutés à nouveau.

Mais vous avez un autre problème avec votre .gitignore, vous utilisez excessivement les caractères génériques et cela le fait correspondre moins que vous ne le pensez. Au lieu de cela, changeons le .gitignore et essayez ceci.

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

2
Merci .... J'ai supprimé tous les fichiers de la branche actuelle et les ai sauvegardés. Puis changé de branche et remettez-la. Ça a marché. Merci aussi pour l'astuce sur le .gitignore
marcamillion

@marcamillion: Qu'entendez-vous par «qui a fonctionné»? Si les fichiers ont été suivis sur la branche vers laquelle vous êtes passé, vous les avez écrasés avec vos versions, ce qui pourrait être différent ...
Cascabel

1
J'avais un problème avec un dossier / build qui n'a pas besoin d'être suivi. J'ai donc supprimé le dossier local, validé mon fichier .gitignore, puis vérifié l'autre branche. Cela a finalement fonctionné pour moi.
Mike S.

16
Je pense que la première partie est pour l'inverse de ce message d'erreur particulier. Cette erreur indique que l'utilisateur se trouve actuellement dans une branche qui n'a pas suivi ces fichiers JPG et que l'utilisateur essaie de passer à celui qui le fait. Ainsi, cela git rm --cachedne fera aucune différence, ces fichiers n'existent pas dans la branche actuelle. Pour cette erreur, je pense que l'utilisateur doit plutôt suivre la réponse de @Greg Hewgill - "les retirer de la copie de travail, changer de branche et les reculer".
studgeek

5
Comment pourrais-je résoudre le problème your files would be overwrittenavec fatal: pathspec 'test/node_modules' did not match any filesquand je le fais git rm -r --cache test/node_modules? Je ne peux pas tirer à cause du message écrasé et je ne peux pas le supprimer parce que git ne peut pas les trouver (ils sont là)
HMR

1047

AVERTISSEMENT: il supprimera les fichiers non suivis, donc ce n'est pas une excellente réponse à la question posée.

J'ai également frappé 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 .

git plus âgé

git clean  -d  -f ""

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

ÊTRE AVERTI!!! CECI DÉTRUIT LE PLUS PROBABLEMENT VOTRE PROJET, UTILISEZ UNIQUEMENT SI VOUS SAVEZ À 100% CE QUE VOUS FAITES

git 2.11 et plus récent

git clean  -d  -fx .

git plus âgé

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 nécessaire pour le forcer à s'exécuter.


7
Merci, après ce nettoyage, j'ai pu rebaser;
Alexander Beletsky

139
FAITES ATTENTION EN COURS git clean!
Noel

249
Pour éviter un facepalm, exécutez-le d'abord avec l'option de marche à sec pour voir ce qu'il ferait: git clean -dfxnougit clean -dfx --dry-run
Dennis

74
Merde. Cela supprime tous les fichiers de configuration sur mon xcode et maintenant le projet se transforme en projet mac. Soyez très prudent lorsque vous exécutez cette commande. Je pensais que cela ne ferait que le supprimer de git.
tyegah123

25
L' -xoption me fait mal
wener

590

Avertissement: cela supprimera les fichiers locaux qui ne sont pas indexés

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


78
Avertissement: cela supprimera les fichiers locaux qui ne sont pas indexés.
givanse

git clean n'a pas fonctionné pour moi, mais la force était exactement ce dont j'avais besoin. Il était coincé sur cette branche et j'en avais juste besoin pour changer de branche.
Simon The Cat

7
Je ne voulais pas du fichier qui n'était pas indexé! +1 pour vous
ryansstack

j'ai eu cette erreur ,,, :(error: pathspec 'mybranch' did not match any file(s) known to git.
Budi Mulyo

2
Telle est la vraie réponse.
metamonkey

147

Si vous êtes sous OS X, cela peut être dû au fait que le nom d'un fichier a changé la casse de certains caractères. Essayez de définir l'option de configuration suivante:

git config core.ignorecase true

13
Cela fonctionnait également sur Windows, il semble que cette situation se soit produite en premier lieu en raison d'un changement de cas que GIT n'a pas pu déterminer
SagiLow

4
C'est exactement le problème que j'ai eu, un chemin de fichier était différent d'une casse à une lettre - Windows le traite de la même manière mais GIT ne le fait pas, ce qui est le problème.
Daniel Sokolowski

1
Mon problème est survenu lors du paiement d'une autre succursale dans Windows 10, et cela ne fonctionne que pour moi, merci
Weijie Sun

impressionnant! cela résout mon problème lorsque je me déplaçais entre les balises
William Añez

1
Cela fonctionne également si vous essayez git rebaseégalement. Merci.
user3890355

42

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

Il y a probablement une raison pour laquelle ces fichiers dans votre developbranche 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à my_publicou quelque chose pour l' instant.

si je revenais dans cette branche après, tout serait parfait jusqu'à mon dernier commit?

Si vous validez vos modifications, Git ne les perdra pas. Si vous ne validez pas vos modifications, Git fera de son mieux pour ne pas écraser le travail que vous avez fait. C'est ce que Git vous avertit dans le premier cas ici (lorsque vous avez essayé de changer de branche).


Merci pour l'explication. J'ai sauvegardé les fichiers, changé de branche et fusionné puis remplacé les fichiers dans le dossier public. Ça a marché.
marcamillion

1
Comme j'ai commenté la réponse de @ Arrowmaster. Ceci est la bonne réponse pour le message d'erreur. Ce n'est peut-être pas la bonne réponse pour ce questionneur en particulier, car les vrais problèmes semblent être son gitignore.
studgeek

38

Cela a fonctionné pour moi.

 1. git fetch --all
 2. git reset --hard origin/{branch_name}

5
Veuillez ajouter des explications sur votre solution. voir stackoverflow.com/help/how-to-answer
user7294900

Voici mon point de vue. Votre copie locale de la branche distante contient en fait tous les fichiers non suivis. Vous vérifiez cela pour restaurer les fichiers non suivis dont il se plaignait à l'origine. Vous pouvez maintenant passer à d'autres branches
ahnbizcad

2
Pour une raison quelconque, c'est la seule solution de travail pour moi. Merci mon pote.
Kiwad

Résolu mon problème. Merci
Devashis Kant

Merci beaucoup, si simple! git reset --soft origin / develop. Comment je déteste ces conflits de fusion d'édition. Cette commande si agréable et simple.
nine9five

22

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

git clean -i

Alors git pullfera l'affaire.


13

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

git clean -f

fonctionnera probablement. Je suggère fortement de courir

git clean --dry-run

première. Cette commande affichera une liste de fichiers que Git supprimera si vous exécutezgit clean -f et pourrait vous éviter de supprimer par inadvertance quelque chose que vous ne vouliez pas.

Voir cette réponse Stack Oveflow ou les documents pour plus d'informations git clean.


12

Malheureusement , ni git rm --cachedougit clean -d -fx "" ne l'a fait pour moi.

Ma solution a fini par pousser ma branche à distance, cloner un nouveau référentiel, puis faire ma fusion dans le nouveau référentiel. Les autres personnes accédant au dépôt devaient faire de même.

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


10

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

git checkout -f dev

Cela m'a aidé, lorsque mon problème n'était pas lié à l' .gitignoreafaik.
Nakilon

erreur: pathspec 'dev' ne correspond à aucun fichier connu de git.
Black

@Black 'dev' est le nom de la branche, mettez votre branche à la place
Vinit Solanki

8

J'ai eu le même problème lors de la vérification dans une branche basée sur une validation antérieure. Git a refusé de payer en raison de fichiers non suivis.

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

Ajout .gitignoreet publication des répertoires concernés$ git rm -r --cached ne sont apparemment pas suffisants.

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

  1. Configurez les fichiers non suivis: éditez le .gitignoreet appliquez $ git rm -r --cachedsur les fichiers et répertoires que vous voulez que le git ignore. Ajoutez également le fichier .gitignorelui-même .gitignoreet n'oubliez pas de le publier $ git rm -r --cached .gitignore. Cela garantira que le comportement ignorer de git reste le même dans les validations précédentes.

  2. Validez les modifications que vous venez d'apporter:

    $ git add -A
    $ git commit

  3. Enregistrez le journal actuel, sinon vous risquez de rencontrer des problèmes pour revenir à la version actuelle

    $ git log > ../git.log

  4. Réinitialisation matérielle du commit 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. Faites votre travail et engagez-le

  8. Revenez dans Master

    $ git checkout master

  9. Rétablir à nouveau 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 git ci-dessus seront perdus.

J'ai également vérifié que les fichiers dont se plaignait Git n'étaient pas supprimés. Je les ai copiés dans un fichier texte et j'ai lancé la commande$ for i in $(cat ../test.txt); do ls -ahl $i; done

Si vous passez à nouveau à la succursale mentionnée ci-dessus, n'oubliez pas d'émettre $ git statuspour vous assurer qu'aucun changement indésirable n'apparaît.


8

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

Le problème est survenu en raison de certains fichiers qui avaient été renommés uniquement pour changer leur cas . Ce qui semble s'être produit est le suivant:

  • Les fichiers ont été enregistrés avec un boîtier mixte dans leurs noms.
  • Dans une validation ultérieure, les noms de fichiers 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 n'a pas obtenu les fichiers car sous Windows 8, ces noms de fichiers sont équivalents.
  • Étant donné que Git est sensible à la casse, il s'est plaint que j'avais des fichiers à casse mixte qui n'étaient pas sous contrôle de source. Mais en utilisant git status, je n'ai pu voir aucun changement, car dans l'invite de commande Windows, ces noms de fichiers sont équivalents.

La solution la plus simple pour moi était:

  • git checkoutune version précédente du projet, bien avant que ces fichiers ne soient ajoutés .
  • Ensuite, git checkoutla dernière version du projet, avec le boîtier de fichier correct.

+1 J'ai pu utiliser git log sur la branche et la branche actuelles pour rebaser pour voir quand la validation s'est produite et qui a changé le cas; puis je l'ai piraté ...
sage

4

Ces deux fonctions (git rm --cached, git checkout -f another-branch) ne fonctionnaient PAS pour moi.

Au lieu de cela, j'ai physiquement supprimé le fichier (dans éclipse) comme ce que Git vous dit de faire; Veuillez les déplacer ou les supprimer avant de pouvoir changer de branche.

puis je l'ajoute / je l'engage.

puis j'ai tiré et ça a marché!


4

Dans mon cas, le problème était avec les sous-modules. mastera été fusionné avec une autre branche 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 aucune des autres solutions suggérées ne fonctionnait pour moi. J'ai forcé le paiement à ma nouvelle succursale et j'ai retiré le maître.

  • git checkout -f my_branch
  • git pull origin master
  • git submodule update --init

3

Dans mon cas, cela git rm --cachedn'a pas fonctionné. Mais je l'ai avec ungit rebase


3

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

La question a été causé quand je renomme ma onMusicUpdateListener.javaà OnMusicUpdateListener.javaen developsuccursale.

Maintenant masteravait onMusicUpdateListener.java et developavait le même dossier queOnMusicUpdateListener.java

Maintenant, chaque fois que je suis passé au master, cela m'a donné une erreur

The following untracked working tree files would be overwritten by checkout

et ensuite aborted.

Pour résoudre ce problème, je force checked out masterbranche, puis renomme ma onMusicUpdateListener.javaà OnMusicUpdateListener.java, committedet puis mergedavec la developbranche.

Ensuite, j'ai mis à jour ma developbranche en mergingelle masteret maintenant tout est revenu à la normale et le problème est résolu.


J'ai rencontré des problèmes similaires auparavant. À ma connaissance, le problème de sensibilité à la casse semble être un problème uniquement sur Windows. Je suppose que vous développez sur Windows?
Ji_in_coding

2

Cela pourrait être un problème d'autorisation,

changer de propriétaire,

sudo chown -v -R usr-name:group-name folder-name

J'ai également eu le même problème que Won. J'ai ajouté un .gitignore à un dossier qui faisait déjà l'objet d'un suivi. J'ai supprimé le fichier et j'ai ensuite pu effectuer une vérification Git.
cbloss793

2

2 fichiers avec le même nom mais un cas différent peuvent être le problème.

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

Déplacer des fichiers au lieu de les 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

1

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


Comment surmonter cette erreur dans ce cas? Ce message apparaît également lors du changement de branche après avoir changé la casse dans un nom de fichier (MonFichier => monfichier).
Bernhard Döbler

1

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

git merge "your branch"

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

erreur: les fichiers d'arborescence de travail non suivis suivants seraient remplacés par la fusion: .vs / slnx.sqlite Veuillez les déplacer ou les supprimer avant de fusionner. Abandon

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


0

Dans mon cas, je voyais cette erreur car j'utilise un CMS open source populaire et le répertoire qui causait des problèmes était le répertoire de téléchargement sur lequel le CMS écrit.

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

J'attrape tous les fichiers du site en direct sur mon site local, puis je vérifierai cela dans le référentiel dans l'espoir que cela résout le problème.


0

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


0

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

J'ai eu le problème plusieurs fois et il peut être lié aux développeurs qui suppriment, poussent, rajoutent, poussent ou quelque chose du genre.


0

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

git merge --strategy=ours master 

0

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 supprimer toute la branche et la créer à nouveau, puis faire git pull origin remotebranch


0

Afin d'enregistrer les fichiers modifiés et d'utiliser le contenu modifié ultérieurement. J'ai trouvé cette erreur pendant que j'essayais de vérifier une branche et lorsque j'essayais de rebaser. Essayez Git Stash

git stash


0

Vérifiez si un nom de dossier contenant '/' ou un symbole spécial, puis renommez ces dossiers. Il vous suffit ensuite de cloner le référentiel vers un autre emplacement.


0

Une solution simple pourrait être: assurez-vous simplement que vous êtes dans le bon répertoire de travail GitBash . Ce message apparaît presque chaque fois si un utilisateur essaie de fusionner un répertoire trop haut dans sa hiérarchie de dossiers.

Exemple:

/workspace/git/myBashSourceFolder/myProjectSourcefolder

Scénario: l'utilisateur a cloné le référentiel en git-foldercréant un nouveau projet Java dans Eclipse, a importé le référentiel cloné. Eclipse a défini myProjectSourceFolder comme dossier source dans son projet local. par conséquent, l'utilisateur l'a entré dans git bash et a poussé, tiré et validé son projet à partir de là. git se synchronise donc myProjectSourceFolder- mais n'a aucun enregistrement dans son historique pour myBashSourceFolder. Par conséquent, un push / pull / merge de myBashSourceFolder produira la sortie donnée, si l'utilisateur essaie de se synchroniser à partir de là la prochaine fois, au lieu du dossier qu'il a travaillé auparavant.

Solution: entrez le dossier correct et réessayez de tirer. Dans presque chaque fois que j'ai rencontré, cette solution a bien fonctionné :)

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.