it-swarm.com.de

Die folgenden nicht verfolgten Arbeitsbaumdateien würden durch Zusammenführen überschrieben, aber das ist mir egal

Auf meinem Zweig hatte ich einige Dateien in .gitignore

In einem anderen Zweig sind diese Dateien nicht.

Ich möchte den anderen Zweig in meinem zusammenführen, und es ist mir egal, ob diese Dateien nicht mehr ignoriert werden oder nicht.

Leider bekomme ich das:

Die folgenden nicht verfolgten Arbeitsbaumdateien würden durch Zusammenführen überschrieben

Wie ändere ich meinen Pull-Befehl, um diese Dateien zu überschreiben, ohne dass ich diese Dateien selbst suchen, verschieben oder löschen muss?

231
CQM

Das Problem ist, dass Sie die Dateien nicht lokal nachverfolgen, sondern identische Dateien remote nachverfolgen, sodass Ihr System zum "Abrufen" gezwungen ist, die lokalen Dateien zu überschreiben, die nicht versionskontrolliert sind.

Versuche zu rennen

git add * 
git stash
git pull

Dadurch werden alle Dateien nachverfolgt, alle lokalen Änderungen an diesen Dateien entfernt und die Dateien dann vom Server abgerufen.

378
userFog

Sie können versuchen, die nicht verfolgten Dateien vom lokalen Befehl zu löschen

Git 2.11 und neuere Versionen:

git clean  -d  -f .

Ältere Versionen von Git:

git clean  -d  -f ""

Wobei -d durch Folgendes ersetzt werden kann:

  • -x ignorierte Dateien werden ebenso entfernt wie Dateien, die Git unbekannt sind.

  • -d entfernt nicht verfolgte Verzeichnisse zusätzlich zu nicht verfolgten Dateien.

  • -f ist erforderlich, um die Ausführung zu erzwingen.

Hier ist der Link , der ebenfalls hilfreich sein kann.

89
silentBeep

Die einzigen Befehle, die für mich funktionierten, waren:

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

Wenn dies eine einmalige Operation ist, können Sie einfach alle nicht verfolgten Dateien aus dem Arbeitsverzeichnis entfernen, bevor Sie den Pull durchführen. Lesen Sie So entfernen Sie lokale (nicht verfolgte) Dateien aus dem aktuellen Git-Arbeitsbaum? , um Informationen zum Entfernen aller nicht verfolgten Dateien zu erhalten.

Achten Sie darauf, nicht versehentlich nicht verfolgte Dateien zu entfernen, die Sie noch benötigen;)

18
mnagel

Sie können diesen Befehl versuchen

git clean -df
16
Amr Mohammed

Alle nicht verfolgten Dateien entfernen:

git clean  -d  -fx .
15
Abhishek Goel

git merge -f existiert nicht, git checkout -f jedoch. Im folgenden Beispiel bedeutet FOI "Dateien von Interesse": Die Dateien, die im Geberzweig vorhanden sind, nicht im Empfangszweig vorhanden sind und die die Zusammenführung blockieren, weil sie in Ihrem Arbeitsverzeichnis vorhanden sind und nicht verfolgt werden. Dies sind die Schritte, um diese Dateien von Interesse zu entfernen, damit Ihre Zusammenführung normal verläuft.

# 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

In Ihrer Frage stellen Sie die Frage, wie ich meinen Befehl pull ändern würde, um diese Dateien zu verwriten.

Pull ist nichts anderes als git fetch (Remote-Verlauf abrufen) + eine automatische Zusammenführung des Upstream-Zweigs. Sie würden also Ihren Pull-Befehl so ändern, dass er (a) Remote-Verlauf abruft, (b) die Dateien mit dem Trick checkout -f überschreibt, (c) den Remote-Verlauf zusammenführt. Die Schritte sehen wie folgt aus:

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

Wenn Sie erwägen, das -f -Flag zu verwenden, können Sie es zuerst als Probelauf ausführen. Nur damit du vorher weißt, in was für einer interessanten Situation du als nächstes landen wirst ;-P

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

Zusätzlich zu der akzeptierten Antwort können Sie die Dateien natürlich entfernen, wenn sie nicht mehr benötigt werden, indem Sie die Datei angeben:

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

Denken Sie daran, es zuerst mit dem Flag -n auszuführen, wenn Sie sehen möchten, welche Dateien git clean entfernen wird. Beachten Sie, dass diese Dateien gelöscht werden. In meinem Fall haben sie mich sowieso nicht interessiert, das war eine bessere Lösung für mich.

6
MMM

Wie unterscheidet sich diese Antwort von anderen Antworten?

Die hier vorgestellte Methode entfernt nur Dateien, die beim Zusammenführen überschrieben würden. Wenn Sie andere nicht verfolgte (möglicherweise ignorierte) Dateien im Verzeichnis haben, werden diese durch diese Methode nicht entfernt.

Die Lösung

Dieses Snippet extrahiert alle nicht verfolgten Dateien, die von git pull überschrieben würden, und löscht sie.

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

und dann mach einfach:

git pull

Dies ist kein Git-Porzellan-Befehl, prüfen Sie also immer, was damit geschehen würde:

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

Erklärung - weil ein Liner unheimlich ist:

Hier ist eine Aufschlüsselung dessen, was es tut:

  1. git pull 2>&1 - erfassen Sie git pull und leiten Sie alles auf stdout um, damit wir es einfach mit grep erfassen können.
  2. grep -E '^\s - Die Absicht ist, die Liste der nicht verfolgten Dateien zu erfassen, die von git pull überschrieben würden. Die Dateinamen enthalten eine Reihe von Leerzeichen, die wir verwenden, um sie zu erhalten.
  3. cut -f2- - Leerzeichen am Anfang jeder in 2 erfassten Zeile entfernen.
  4. xargs -I {} rm -rf "{}" - verwenden Sie xargs, um alle Dateien zu durchlaufen, speichern Sie ihren Namen in "{}" und rufen Sie rm für jede von ihnen auf. Wir verwenden -rf, um das Löschen und Entfernen nicht verfolgter Verzeichnisse zu erzwingen.

Es wäre großartig, die Schritte 1 bis 3 durch einen Porzellanbefehl zu ersetzen, aber mir ist kein Äquivalent bekannt.

6
matt

Für diejenigen, die es nicht wissen, ignoriert Git die Unterschiede zwischen Groß- und Kleinbuchstaben in Dateien und Ordnern. Dies stellt sich als Albtraum heraus, wenn Sie sie in genau denselben Namen mit einem anderen Fall umbenennen.

Ich bin auf dieses Problem gestoßen, als ich einen Ordner von "Petstore" in "Petstore" (Groß- in Kleinbuchstaben) umbenannt habe. Ich hatte meine .git/config-Datei bearbeitet, um die Groß- und Kleinschreibung nicht mehr zu ignorieren, Änderungen vorzunehmen, meine Commits zu quetschen und meine Änderungen zu speichern, um in einen anderen Zweig zu wechseln. Ich konnte meine verstauten Änderungen nicht auf diesen anderen Zweig anwenden.

Das Update, das ich fand, das funktionierte, war, meine .git/config Akte vorübergehend zu redigieren, um Fall wieder vorübergehend zu ignorieren. Dies führte dazu, dass git stash apply erfolgreich war. Dann habe ich ignoreCase wieder in false geändert. Ich habe dann alles hinzugefügt, außer den neuen Dateien im Petstore-Ordner, von denen seltsamerweise behauptet wurde, dass sie aus irgendeinem Grund gelöscht wurden. Ich habe meine Änderungen übernommen und dann git reset --hard HEAD ausgeführt, um diese nicht verfolgten neuen Dateien zu entfernen. Mein Commit wurde genau wie erwartet angezeigt: Die Dateien im Ordner wurden umbenannt.

Ich hoffe, das hilft dir, meinen gleichen Albtraum zu vermeiden.

2
A. Davidson

Eine Möglichkeit, dies zu tun, besteht darin, lokale Änderungen zu verwahren und vom Remote-Repository abzurufen. Auf diese Weise verlieren Sie nicht Ihre lokalen Dateien, da die Dateien in den Stash gelangen.

git add -A
git stash
git pull

Sie können Ihre lokal gespeicherten Dateien mit diesem Befehl überprüfen - git stash list