web-dev-qa-db-fra.com

Les fichiers d'arbre de travail non suivis suivants seraient écrasés par fusion, mais je m'en fiche

Sur ma branche, j'avais des fichiers dans .gitignore

Sur une autre branche, ces fichiers ne le sont pas.

Je souhaite fusionner les différentes branches dans la mienne et je ne me soucie pas de savoir si ces fichiers ne sont plus ignorés ou pas.

Malheureusement, je reçois ceci:

Les fichiers d’arbre de travail non suivis suivants seraient écrasés par fusion

Comment pourrais-je modifier ma commande pull pour écraser ces fichiers, sans que je doive rechercher, déplacer ou supprimer ces fichiers moi-même?

231
CQM

Le problème est que vous ne suivez pas les fichiers localement mais que des fichiers identiques sont suivis à distance, donc, pour "extraire" votre système serait forcé d'écraser les fichiers locaux qui ne sont pas contrôlés par la version.

Essayez de courir

git add * 
git stash
git pull

Cela suivra tous les fichiers, supprimera toutes les modifications locales apportées à ces fichiers, puis obtiendra les fichiers du serveur.

378
userFog

Vous pouvez essayer de commander pour effacer les fichiers non suivis du répertoire local.

Git 2.11 et les versions plus récentes:

git clean  -d  -f .

Anciennes versions de Git:

git clean  -d  -f ""

-d peut être remplacé par ce qui suit:

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

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

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

Voici le lien qui peut être utile aussi.

89
silentBeep

Les seules commandes qui ont fonctionné pour moi étaient:

git fetch --all
git reset --hard Origin/{{your branch name}}
63
Asaf Manassen

S'il s'agit d'une opération unique, vous pouvez simplement supprimer tous les fichiers non suivis du répertoire de travail avant de procéder à l'extraction. Lire Comment supprimer des fichiers locaux (non suivis) de l’arbre de travail Git actuel? pour plus d’informations sur la façon de supprimer tous les fichiers non suivis.

Assurez-vous de ne pas supprimer accidentellement les fichiers non suivis dont vous avez encore besoin;)

18
mnagel

Vous pouvez essayer cette commande

git clean -df
16
Amr Mohammed

Supprimer tous les fichiers non suivis:

git clean  -d  -fx .
15
Abhishek Goel

git merge -f n'existe pas, mais git checkout -f existe. Dans l'exemple ci-dessous, FOI signifie "fichiers d'intérêt": les fichiers qui existent dans la branche donneur, n'existent pas dans la branche réceptrice et qui bloquent la fusion car ils sont présents et non suivis dans votre répertoire de travail. Voici les étapes à suivre pour supprimer ces fichiers d’intérêt, afin que votre fusion se déroule normalement.

# FOI is the 'files of interest', the untracked files blocking the merge.

# 1. This forcibly replaces untracked FOI with tracked versions of
# the donor branch (as well as updating the rest of the working dir).
git checkout -f donor-branch

# 2. This removes the FOI because they they are tracked in our current
# (donor) branch, and absent in the `receiving-branch` we switch to.
git checkout receiving-branch

# 3. Now that the FOI are absent, merging in the donor branch will not
# overwrite any untracked files, so we get no errors.
git merge donor-branch

Dans votre question, vous demandez: "Comment pourrais-je modifier ma commande pull afin d'écrire ces fichiers"?

Pull n'est rien d'autre que git fetch (acquiert l'historique distant) + une fusion automatique de la branche en amont. Ainsi, vous modifieriez votre commande pull pour devenir (a) récupérer l'historique à distance, (b) utiliser l'astuce checkout -f pour écraser les fichiers, (c) fusionner l'historique à distance. Les étapes ressembleront à ceci:

git fetch Origin
git checkout -f Origin/mybranch
git checkout mybranch
git merge Origin/mybranch
8
Esteis

Si vous envisagez d'utiliser l'indicateur -f, vous pouvez d'abord l'exécuter en exécution sèche. Juste que vous sachiez dès le départ quel genre de situation intéressante vous allez vous retrouver ensuite ;-P

-n 
--dry-run 
    Don’t actually remove anything, just show what would be done.
6
Maarten

En plus de la réponse acceptée, vous pouvez bien sûr supprimer les fichiers s'ils ne sont plus nécessaires en spécifiant le fichier:

git clean -f '/path/to/file/'

Souvenez-vous de l'exécuter avec l'option -n si vous voulez voir quels fichiers seront supprimés par git clean. Notez que ces fichiers seront supprimés. Dans mon cas, de toute façon, je m'en foutais, alors c'était une meilleure solution pour moi.

6
MMM

Comment cette réponse diffère des autres réponses?

La méthode présentée ici ne supprime que les fichiers qui seraient écrasés par fusion. Si vous avez d'autres fichiers non suivis (éventuellement ignorés) dans le répertoire, cette méthode ne les supprimera pas.

La solution

Cet extrait extrait tous les fichiers non suivis qui seraient écrasés par git pull et les supprimera.

git pull 2>&1|grep -E '^\s'|cut -f2-|xargs -I {} rm -rf "{}"

et puis juste faire:

git pull

Ceci n'est pas une commande de porcelaine git, vérifiez donc toujours ce qu'il ferait avec:

git pull 2>&1|grep -E '^\s'|cut -f2-|xargs -I {} echo "{}"

Explication - parce qu’une des doublures fait peur:

Voici un aperçu de ce qu'il fait:

  1. git pull 2>&1 - capturez la sortie git pull et redirigez le tout vers la sortie standard afin de pouvoir la capturer facilement avec grep.
  2. grep -E '^\s - le but est de capturer la liste des fichiers non suivis qui seraient écrasés par git pull. Les noms de fichiers sont précédés de plusieurs caractères d'espaces, nous les utilisons pour les obtenir.
  3. cut -f2- - supprime les espaces au début de chaque ligne capturée dans 2.
  4. xargs -I {} rm -rf "{}" - us xargs pour parcourir tous les fichiers, enregistrez leur nom dans "{}" et appelez rm pour chacun d'entre eux. Nous utilisons -rf pour forcer la suppression et la suppression des répertoires non suivis.

Ce serait bien de remplacer les étapes 1 à 3 par une commande de porcelaine, mais je ne connais aucun équivalent.

6
matt

Pour ceux qui ne le savent pas, git ignore les différences de noms de majuscules/minuscules dans les fichiers et les dossiers. Cela s'avère être un cauchemar lorsque vous les renommez avec exactement le même nom avec un cas différent.

J'ai rencontré ce problème lorsque j'ai renommé un dossier "Petstore" en "petstore" (majuscule en minuscule). J'avais édité mon fichier .git/config pour cesser d'ignorer la casse, apporté des modifications, écrasé mes commits et mis en cache mes modifications pour passer à une autre branche. Je ne pouvais pas appliquer mes modifications cachées à cette autre branche.

Le correctif que j'ai trouvé qui fonctionnait était de modifier temporairement mon fichier .git/config pour ignorer temporairement la casse à nouveau. Ceci a entraîné le succès de git stash apply. Ensuite, j'ai changé ignoreCase en false. J'ai ensuite tout ajouté, à l'exception des nouveaux fichiers dans le dossier Petstore, qui prétend étrangement avoir été supprimés, pour une raison quelconque. J'ai validé mes modifications, puis exécuté git reset --hard HEAD pour supprimer les nouveaux fichiers non suivis. Ma validation est apparue exactement comme prévu: les fichiers du dossier ont été renommés.

J'espère que cela vous aidera à éviter mon même cauchemar.

2
A. Davidson

Pour ce faire, vous pouvez notamment stocker vos modifications locales et les extraire du référentiel distant. De cette façon, vous ne perdrez pas vos fichiers locaux car ils iront dans la réserve.

git add -A
git stash
git pull

Vous pouvez vérifier vos fichiers stockés locaux à l’aide de cette commande - git stash list