2016-03-29 13 views
0

Ich habe die folgende Situation: Mein Git-Repository hatte zuvor eingefügte .project-Dateien zerstört, und wir wollten sie entfernen, da sie alle Arten von Importproblemen verursachen. Also habe ich einen Zweig erstellt, wo ich alle .project-Dateien entfernt, ".project" zu .gitignore hinzugefügt habe und geplant hatte, ihn in den Master zu integrieren, alle Entwickler das neueste Update herunterziehen und erneut importieren zu lassen. Ich habe das getestet und es funktioniert gut ... neue Metadaten (z. B. Projektdateien) werden von Eclipse erstellt, aber wegen der .gitignore-Änderung ignoriert.Verhindern, dass ignorierte Dateien am git checkout geändert werden

Das Problem ist, wenn ein Entwickler zu einem ihrer Ausgabezweige wechselt, die Pre-Fix erstellt wurde, hat dieser Zweig noch die alten (falschen) .Project-Dateien, die beim Überschreiben überschreiben, was gerade erzeugt wurde ihr Arbeitsverzeichnis. Das bricht alles ...

Ich habe versucht "update-index --skip-worktree" und "--assume-unverändert", aber es würde nicht richtig funktionieren, nehme ich an, weil diese Dateien nicht mehr im Index waren und wurden ignoriert. Gibt es irgendeinen Weg, kurz davor, den Meister zurück in alle seine Zweige zu bringen, bevor er ihnen sagt, alles neu zu importieren, dass ich das lösen kann?

Danke.

EDIT: Ich sollte beachten, während ich mit git ziemlich erfahren bin, sind die Entwickler in meinem Team komplette Neulinge. Im Idealfall wäre jede Lösung, die ich auf der Reposeite machen könnte, und sie könnten einfach auf "Pull" klicken und alles automatisch ablaufen lassen. Wenn es einen einzigen Befehl gäbe, der sie durch die SourceTree-Konsole laufen lassen könnte, könnte das auch funktionieren ...

+0

Vielleicht möchten Sie die Datei vollständig aus dem Repository löschen? – user3159253

Antwort

1

Wahrscheinlich, wenn Sie mit allen Benutzern Ihres Repository verhandeln können, dann wäre der am besten geeignete Weg für Sie neu zu schreiben das gesamte Repository, löscht die Datei vollständig. Verwenden Sie git filter-branch, etwa so:

git filter-branch --tree-filter 'rm -f .project && \ 
    if ! test -f .gitignore || ! grep -q "^\.project$" .gitignore; \ 
    then \ 
     echo .project >>.gitignore; \ 
    fi' -- --all 

Wenn Ihr Repository groß genug ist, dann haben Sie wahrscheinlich wollen --index-filter verwenden, anstatt --tree-filter weil --index-filter direkt auf git DB arbeitet ohne Commit im Repository aus jeder Überprüfung. Aber das Skript für --index-filter ist komplexer und umständlicher.

Dann, nachdem das Repository neu geschrieben wurde und Sie überprüft haben, dass jedes Commit in jeder Verzweigung die gewünschten Änderungen erhalten hat, sollten alle Entwickler das Repo erneut abrufen. Es wäre besser, sie zu bitten, alle ihre lokalen Änderungen in das Repository zu übertragen, bevor Sie damit beginnen, die Arbeit des Rebasings zu minimieren, wenn sie das geänderte Repository erhalten.

+0

Wir haben Jahre der Geschichte und Tonnen von Zweigen ... so muss ich vielleicht die Index-Filter-Option herausfinden. Ich nehme an, dass ein Force Push erforderlich ist, nachdem ich diese Änderungen vorgenommen habe, um den Ursprung zu aktualisieren. – austin1howard

+0

Ja, Kraftstoß ist unbedingt erforderlich. In Bezug auf '--tree-filter' vs' --index-filter': es kommt darauf an. Ich würde eine solche Operation unter Linux durchführen (normalerweise arbeitet git schneller auf ihren Dateisystemen) und würde eine Kopie des Repos auf tmpfs oder zumindest auf einem SSD-Laufwerk erstellen, und vielleicht könnten Sie nicht komplexer werden Lösung. – user3159253

+1

Eine andere mögliche Vereinfachung des '--index-Filters' könnte passieren, wenn es sich anbietet, die gleiche' .gitignore' Datei über alle _existierenden_ Commits zu haben (in Zukunft können Sie sie ändern). In diesem Fall wären Indexmanipulationen wesentlich einfacher, da Sie alle benötigten Hashes im Voraus vorberechnen können. – user3159253