Ich habe eine Reihe von Dateien in einem Changeset, möchte aber ausdrücklich eine einzelne modifizierte Datei ignorieren. Sieht nach git status
so aus:
# modified: main/dontcheckmein.txt
# deleted: main/plzcheckmein.c
# deleted: main/plzcheckmein2.c
...
Gibt es eine Möglichkeit, git add
zu tun, aber einfach die einzige Textdatei zu ignorieren, die ich nicht berühren möchte? So etwas wie:
git add -u -except main/dontcheckmein.txt
git add -u
git reset -- main/dontcheckmein.txt
1) Zum Ignorieren von Änderungen an einer einzigen bereits versionierten Datei
git update-index --assume-unchanged "main/dontcheckmein.txt"
und diesen git update-index --no-assume-unchanged "main/dontcheckmein.txt"
rückgängig machen
2) Um eine bestimmte einzelne Datei vollständig zu ignorieren, kann sie am Repository nicht erstellt werden.
Sehen Sie sich zuerst dieses Git global ignorieren nicht an
und bei .gitignore
den relativen Pfad zur Datei hinzufügen, ohne ./
wenn sich Ihre Datei unter MyProject/MyFolder/myfile.txt
befindet (wobei .git
auch bei MyProject
ist), setzen Sie bei .gitignore
einfach diesen MyFolder/myfile.txt
sie können mit git check-ignore "MyFolder/myfile.txt"
bestätigen, welche Regel mit dem Ignorieren zusammenhängt.
Über globales Ignorieren
Dieser Link spricht von ~/.gitignore_global
; aber die Datei hängt mit Ihrem Projekt zusammen. Wenn Sie also das Ausschlussmuster MyFolder/myfile.txt
unter ~/.gitignore_global
setzen, funktioniert es, macht aber keinen Sinn.
Wenn Sie dagegen Ihr Projekt mit git config core.excludesfile .gitignore
einrichten, wobei .gitignore
auf MyProject
steht, dieses Setup überschreibt ~/.gitignore_global
, der sehr nützliche Regeln ... haben kann.
Im Moment denke ich, dass es am besten ist, ein Skript zu erstellen, um Ihren .gitignore
mit ~/.gitignore_global
unter .gitignore
zu mischen.
Eine letzte Warnung
Wenn sich die zu ignorierende Datei bereits im Repository befindet, funktioniert diese Methode nur, wenn Sie Folgendes tun: git rm "MyFolder/myfile.txt"
, aber sichern Sie sie zuerst, da sie auch lokal entfernt wird! Sie können es später wieder kopieren ...
Für eine Datei
git add -u
git reset -- main/dontcheckmein.txt
Für einen Ordner
git add -u
git reset -- main/*
Während Ben Jackson Recht hat, dachte ich, ich würde hinzufügen, wie ich diese Lösung auch benutze. Im Folgenden finden Sie ein sehr einfaches Skript, das ich benutze (das ich gitadd nenne), um alle Änderungen hinzuzufügen, mit Ausnahme einiger weniger, die ich in einer Datei namens .gittrackignore
aufgeführt halte (sehr ähnlich wie .gitignore).
#!/bin/bash
set -e
git add -A
git reset `cat .gittrackignore`
Und so sieht mein derzeitiger .gittrackignore
aus.
project.properties
Ich arbeite an einem Android-Projekt, das ich bei der Bereitstellung über die Befehlszeile kompiliere. Dieses Projekt hängt von SherlockActionBar ab, daher muss es in project.properties referenziert werden, aber das macht die Kompilierung aus. Ich gebe jetzt einfach gitadd
ein und füge alle Änderungen zu git hinzu, ohne jedesmal das Projekt hinzufügen zu müssen .
Jetzt unterstützt git
exclude certain paths and files
durch pathspec magic :(exclude)
und seine Kurzform :!
. So können Sie es leicht mit dem folgenden Befehl erreichen.
git add --all -- :!main/dontcheckmein.txt
git add -- . :!main/dontcheckmein.txt
Eigentlich kannst du noch mehr angeben:
git add --all -- :!path/to/file1 :!path/to/file2 :!path/to/folder1/*
git add -- . :!path/to/file1 :!path/to/file2 :!path/to/folder1/*
Versuche dies:
git checkout - main/dontcheckmein.txt
Um die Änderung in der Datei zu behalten, aber nicht zu bestätigen, habe ich dies getan
git add .
git reset -- main/dontcheckmein.txt
git commit -m "commit message"
um zu überprüfen, ob die Datei ausgeschlossen ist
git status
Verwenden Sie git add -A
, um alle geänderten und neu hinzugefügten Dateien gleichzeitig hinzuzufügen.
Beispiel
git add -A
git reset -- main/dontcheckmein.txt
Für den speziellen Fall in der Frage ist es am einfachsten, alle Dateien mit der Erweiterung . C hinzuzufügen und alles andere wegzulassen:
git add *.c
Von git-scm (oder/und man git add
):
git add <pathspec>…
Dateien, aus denen Inhalte hinzugefügt werden sollen. Mit Fileglobs (z. B. * .c) können alle übereinstimmenden Dateien hinzugefügt werden. <...>
Beachten Sie, dass dies bedeutet, dass Sie auch Folgendes tun können:
git add **/main/*
um alle Dateien (die nicht ignoriert werden) hinzuzufügen, die sich im Ordner main
befinden. Sie können sogar mit aufwändigeren Mustern wild werden:
git add **/s?c/*Service*
Das Obige fügt alle Dateien hinzu, die sich im Ordner s(any char)c
befinden und irgendwo in ihrem Dateinamen Service
enthalten.
Natürlich sind Sie nicht auf ein Muster pro Befehl beschränkt. Das heißt, Sie können git bitten, alle Dateien mit der Erweiterung .c und hinzuzufügen. H :
git add *.c *.h
Dies Link könnte Ihnen einige weitere Ideen für Glob-Muster geben.
Ich finde es besonders nützlich, wenn ich viele Änderungen vornehme, aber trotzdem möchte, dass meine Commits atomar bleiben und den allmählichen Prozess widerspiegeln, anstatt eine Vielzahl von Änderungen vorzunehmen, an denen ich gerade arbeite. Natürlich überwiegen irgendwann die Kosten für die Erstellung ausgefeilter Muster die Kosten für das Hinzufügen von Dateien mit einfacheren Methoden oder sogar für jeweils eine Datei. Meistens bin ich jedoch in der Lage, genau die Dateien zu finden, die ich mit einem einfachen Muster benötige, und alles andere auszuschließen.
Übrigens müssen Sie may Ihre Glob-Muster angeben, damit sie funktionieren, aber das war bei mir nie der Fall.
Zu behebende Änderungen: (verwende "git reset HEAD ...", um die Bühne zu entfernen)
Ich benutze git add --patch
ziemlich oft und wollte so etwas, um nicht schlagen zu müssen d die ganze Zeit über die gleichen Dateien. Ich habe ein paar sehr hackige Git-Aliase zusammengestellt, um den Job zu erledigen:
[alias]
HELPER-CHANGED-FILTERED = "!f() { git status --porcelain | cut -c4- | ( [[ \"$1\" ]] && egrep -v \"$1\" || cat ); }; f"
ap = "!git add --patch -- $(git HELPER-CHANGED-FILTERED 'min.(js|css)$' || echo 'THIS_FILE_PROBABLY_DOESNT_EXIST' )"
In meinem Fall wollte ich nur bestimmte verkleinerte Dateien die ganze Zeit ignorieren, aber Sie könnten dafür eine Umgebungsvariable wie $GIT_EXCLUDE_PATTERN
für einen allgemeineren Anwendungsfall verwenden.