Mam kilka plików w zestawie zmian, ale chcę specjalnie zignorować pojedynczy zmodyfikowany plik. Wygląda tak po git status
:
# modified: main/dontcheckmein.txt
# deleted: main/plzcheckmein.c
# deleted: main/plzcheckmein2.c
...
Czy mogę to zrobić, git add
ale po prostu zignoruj jeden plik tekstowy, którego nie chcę dotykać? Coś jak:
git add -u -except main/dontcheckmein.txt
main/*
, konieczne jest dodanie--
przed nim, aby poinformować git, że jest to ścieżka. Pozostałe dwa warianty działają bez uwzględnienia dwóch myślników. (Testowane w wierszu polecenia w systemie Windows 7 z msysGit)git reset
dla tych folderów później będzie nadal działać, ale dodanie dużych folderów zajmie trochę czasu.1) Aby rozpocząć ignorowanie zmian w jednym już wersjonowanym pliku
i cofnąć to
git update-index --no-assume-unchanged "main/dontcheckmein.txt"
github docs, aby zignorować pliki
2) Całkowite zignorowanie konkretnego pojedynczego pliku, uniemożliwiając jego utworzenie w repozytorium
Najpierw spójrz na ten post stackflowflow : Git globalne ignorowanie nie działa
W
.gitignore
dodaj ścieżkę względną do pliku bez prowadzenia./
.Tak więc, jeśli twój plik znajduje się w
MyProject/MyFolder/myfile.txt
(gdzie.git
jest również wMyProject
folderze), dodajMyFolder/myfile.txt
do.gitignore
pliku at .Możesz potwierdzić, jakie reguły są powiązane z ignorowaniem przez
git check-ignore "MyFolder/myfile.txt"
O globalnym ignorowaniu
Ten link mówi
~/.gitignore_global
, ale plik jest powiązany z twoim projektem. Tak więc, jeśli umieścić wyklucza wzórMyFolder/myfile.txt
w~/.gitignore_global
, to będzie działać, ale nie będzie sensu ...Z drugiej strony, jeśli skonfigurujesz projekt z tym,
git config core.excludesfile .gitignore
gdzie.gitignore
jestMyProject
, plik lokalny zastąpi się~/.gitignore_global
, co może mieć bardzo przydatne reguły ...Więc teraz, myślę, że najlepiej zrobić jakiś skrypt, aby mieszać
.gitignore
z~/.gitignore_global
co.gitignore
.Ostatnie ostrzeżenie
Jeśli plik, który chcesz zignorować, znajduje się już w repozytorium, ta metoda nie będzie działać, chyba że to zrobisz:
git rm "MyFolder/myfile.txt"
ale najpierw wykonaj kopię zapasową, ponieważ zostanie ona również usunięta lokalnie! Możesz skopiować go później ...źródło
git rm --cached MyFolder/myyfile.txt
do usunięcia pliku z repozytorium, ale zachowaj go lokalnie. Wyjaśnienie na help.github.comDla pliku
Dla folderu
źródło
git add . && git reset -- main/*
?git push origin master
następnego wypychania, tylkogit push
git będzie wiedział, że to w gałęzi master. Mam nadzieję, że to pomoże.Teraz
git
obsługujeexclude certain paths and files
magię pathspec:(exclude)
i jej krótką formę:!
. Możesz więc łatwo to osiągnąć, wykonując następujące polecenie.W rzeczywistości możesz podać więcej:
źródło
:!...
klauzule, aby powłoka nie narzekała. Tak więc, na przykład:git add --all -- ':!path/to/file1' ':!path/to/file2' ':!path/to/folder1/*'
.:!/path/to/(file1|file2)
?Chociaż Ben Jackson ma rację, pomyślałem, że dodam również to, jak korzystam z tego rozwiązania. Poniżej znajduje się bardzo prosty skrypt, którego używam (nazywam gitadd), aby dodać wszystkie zmiany oprócz kilku wybranych, które trzymam na liście w pliku o nazwie
.gittrackignore
(bardzo podobny do działania .gitignore).I tak
.gittrackignore
wygląda mój obecny .Pracuję nad projektem Androida, który kompiluję z wiersza poleceń podczas wdrażania. Ten projekt zależy od SherlockActionBar, więc należy się do niego odwoływać w project.properties, ale to komplikuje się w kompilacji, więc teraz po prostu wpisuję
gitadd
i dodam wszystkie zmiany do git bez konieczności cofania dodawania project.properties za każdym razem.źródło
--
było do czasu twojego komentarza. Według stron podręcznika man jest opcjonalny i nie zmienia wyniku polecenia (przynajmniej w tym przypadku). To pytanie wydaje się wspierać, że stackoverflow.com/questions/17800994/... . Popraw mnie, jeśli się mylę, ale wygląda na to, że oznacza to „traktuj wszystko--
jako argumenty, a nie opcje / przełączniki”--
wgit checkout
Widzę w tym pytaniu. Nie wiedziałem też, co to za podwójna kreska, aż do tej naszej wymiany. Zastanawiam się, czygit checkout
niejednoznaczność między gałęziami a plikami może mieć wpływ również w tej lub innej formiegit reset
.Zrobiłem to, aby zachować zmianę w pliku, ale nie zatwierdzić
git add .
git reset -- main/dontcheckmein.txt
git commit -m "commit message"
aby sprawdzić, czy plik jest wykluczony, wykonaj
git status
źródło
Służy
git add -A
do dodawania wszystkich zmodyfikowanych i nowo dodanych plików jednocześnie.Przykład
źródło
źródło
Spróbuj tego:
źródło
W konkretnym przypadku w pytaniu najłatwiej byłoby dodać wszystkie pliki z rozszerzeniem .c i pominąć wszystko inne:
Z git-scm (lub / i
man git add
):Pamiętaj, że oznacza to, że możesz również zrobić coś takiego:
aby dodać wszystkie pliki (które nie są ignorowane) znajdujące się w
main
folderze. Możesz nawet zaszaleć dzięki bardziej wyszukanym wzorom:Powyżej doda wszystkie pliki, które są w
s(any char)c
folderze i mająService
gdzieś w nazwie pliku.Oczywiście nie jesteś ograniczony do jednego wzorca na polecenie. Oznacza to, że możesz poprosić git o dodanie wszystkich plików z rozszerzeniem .c i .h :
Ten link może dać ci więcej pomysłów na globalne wzorce.
Uważam, że jest to szczególnie przydatne, gdy dokonuję wielu zmian, ale nadal chcę, aby moje zobowiązania pozostały atomowe i odzwierciedlały stopniowy proces, a nie mnogość zmian, nad którymi mógłbym wówczas pracować. Oczywiście w pewnym momencie koszt opracowania skomplikowanych wzorów przewyższa koszt dodawania plików prostszymi metodami lub nawet jednego pliku na raz. Jednak przez większość czasu jestem w stanie łatwo zlokalizować tylko potrzebne mi pliki za pomocą prostego wzoru i wykluczyć wszystko inne.
Nawiasem mówiąc, być może będziesz musiał zacytować swoje globalne wzorce, aby działały, ale nigdy tak nie było.
źródło
Używam
git add --patch
całkiem sporo i chciałem czegoś takiego, aby uniknąć konieczności ciągłego dprzeszukiwania tych samych plików. Wymyśliłem bardzo zuchwałą parę aliasów git, aby wykonać zadanie:W moim przypadku chciałem po prostu cały czas ignorować niektóre zminimalizowane pliki, ale możesz sprawić, aby używał zmiennej środowiskowej, tak jak
$GIT_EXCLUDE_PATTERN
w przypadku bardziej ogólnego przypadku.źródło
Zmiany do zatwierdzenia: (użyj „git reset HEAD ...”, aby wycofać się ze sceny)
źródło
Możesz spróbować:
git add * && git reset main/dontcheckmein.txt
źródło