webentwicklung-frage-antwort-db.com.de

Hinzufügen aller Dateien zu einem Commit außer einer einzelnen Datei?

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
427
user291701
git add -u
git reset -- main/dontcheckmein.txt
666
Ben Jackson

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

überprüfe hier

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 ...

105
Aquarius Power

Für eine Datei

git add -u
git reset -- main/dontcheckmein.txt

Für einen Ordner

git add -u
git reset -- main/*
59
Rituraj ratan

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 .

19
Anthony Naddeo

Jetzt unterstützt gitexclude 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/*
17
cateyes

Versuche dies:

git checkout - main/dontcheckmein.txt

4
Abz

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

2
gsumk

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
2
Dhanuka Nuwan

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.

1
cegas

Zu behebende Änderungen: (verwende "git reset HEAD ...", um die Bühne zu entfernen)

0
colin rickels

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.

0
Chris