Jak zatrzymać śledzenie i zignorować zmiany w pliku w Git?
Sklonowałem projekt, który zawiera pliki .csproj
. Nie potrzebuję / jak moje lokalne pliki csproj
śledzone przez Git( lub podnoszone podczas tworzenia patcha), ale oczywiście są one potrzebne w projekcie.
Dodałem *.csproj
do mojego lokalnego .gitignore
, ale pliki są już w repo.
Kiedy wpiszę git status, wyświetla moje zmiany na csproj
, których nie chcę śledzić ani zgłaszać do patcha.
Jak usunąć "śledzenie" tych plików z mojego osobistego repo (ale zachować je w źródle, więc mogę z nich korzystać) tak, że nie widzę zmian podczas robienia statusu (lub tworzenia patcha)?
Czy istnieje poprawny / kanoniczny sposób radzenia sobie z tą sytuacją?
15 answers
Samo wywołanie git rm --cached
na każdym z plików, które chcesz usunąć z kontroli wersji, powinno być w porządku. Tak długo, jak Twoje lokalne wzorce ignorowania są poprawne, nie zobaczysz tych plików zawartych w pliku wyjściowym Git status.
Zauważ, że to rozwiązanie usuwa pliki z repozytorium, więc wszyscy programiści będą musieli utrzymywać własne lokalne (bez kontroli wersji) kopie pliku
Aby git nie wykrywał zmian w tych plikach powinieneś również użyć tego polecenie:
git update-index --assume-unchanged [path]
Co prawdopodobnie chcesz zrobić: (from below @ Ryan Taylor answer )
- to jest po to, aby powiedzieć gitowi, że chcesz mieć własną, niezależną wersję pliku lub folderu. Na przykład nie chcesz nadpisywać (lub usuwać) pliki konfiguracyjne produkcji/inscenizacji.
git update-index --skip-worktree <path-name>
Pełna odpowiedź jest tutaj w tym URL: http://source.kohlerville.com/2009/02/untrack-files-in-git/
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-23 12:28:13
Jeśli to zrobisz git update-index --assume-unchanged file.csproj
, git nie sprawdzi pliku.csproj dla zmian automatycznie: to powstrzyma ich pojawianie się w git status za każdym razem, gdy je zmienisz. Więc możesz oznaczyć wszystkie swoje .pliki csproj w ten sposób-chociaż będziesz musiał ręcznie oznaczyć wszystkie nowe, które wysyła repo. (Jeśli masz je w swoim .gitignore
lub .git/info/exclude
, wtedy te, które utworzysz, zostaną zignorowane)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-15 16:08:40
Jest to proces dwuetapowy:
-
Usuń śledzenie pliku / folderu - ale zachowaj je na Dysku-używając
git rm --cached
Teraz nie pojawiają się jako "zmienione", ale nadal pokazują jako
untracked files in git status -u
Dodaj je do
.gitignore
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-23 21:07:37
Istnieją 3 opcje, prawdopodobnie chcesz #3
1. to zatrzyma plik lokalny dla ciebie, ale usunie go dla każdego innego, gdy zostanie pobrany.
git rm --cached <file-name>
lub git rm -r --cached <folder-name>
2. jest to optymalizacja, jak folder z dużą liczbą plików, np. SDK, które prawdopodobnie nigdy się nie zmienią. Mówi gitowi, aby przestał sprawdzać ten ogromny folder za każdym razem pod kątem zmian, lokalnie, ponieważ nie będzie miał żadnych. Indeks assume-unchanged
zostanie zresetowany, a plik(y) nadpisany jeśli są zmiany w pliku/folderze (podczas pobierania).
git update-index --assume-unchanged <path-name>
3. to jest po to, aby powiedzieć gitowi, że chcesz mieć własną, niezależną wersję pliku lub folderu. Na przykład nie chcesz nadpisywać (lub usuwać) plików konfiguracyjnych produkcji/stagingu.
git update-index --skip-worktree <path-name>
Ważne jest, aby wiedzieć, że git update-index
nie będzie propagować z Gitem, a każdy użytkownik będzie musiał uruchomić go niezależnie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-02 17:40:39
Zaakceptowana odpowiedź nadal nie działa dla mnie
Użyłem
Git rm-r --cached .
Git add .
Git commit-m " fixing .gitignore "
Znaleziono odpowiedź z tutaj
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-18 05:44:44
Zapomniałem twojego .gitignore?
Jeśli masz cały projekt lokalnie, ale zapomniałeś dodać Git ignore i teraz śledzisz niepotrzebne pliki użyj tej komendy, aby usunąć wszystko
git rm --cached -r .
Upewnij się, że jesteś u podstaw projektu.
Wtedy możesz zrobić to, co zwykle
Dodaj
git add .
Commit
git commit -m 'removed all and added with git ignore'
Push
git push origin master
Podsumowanie
Mam nadzieję, że to pomoże ludziom, którzy muszą wprowadzić zmiany w swoim .gitignore
lub zapomnieli o tym wszystkim razem.
- usuwa cały cache
- patrzy na Ciebie .gitignore
- dodaje pliki, które chcesz śledzić
- popycha do repo
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-11 08:51:12
Aby zaoszczędzić trochę czasu zasady, które dodajesz do swojego .gitignore może być używany do usuwania wielu plików / folderów, np.
git rm --cached app/**/*.xml
Lub
git rm --cached -r app/widgets/yourfolder/
E. t. c.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-07 13:18:52
Jak zaznaczono w innych odpowiedziach, wybrana odpowiedź jest błędna.
ODPOWIEDŹ na inne pytanie sugeruje, że może to być skip-worktree, który byłby wymagany.
git update-index --skip-worktree <file>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:41
Wiele osób radzi, aby używać git update-index --assume-unchanged
. Rzeczywiście, może to być dobre rozwiązanie, ale tylko na krótką metę.
To, co prawdopodobnie chcesz zrobić, to: git update-index --skip-worktree
.
(trzecia opcja, której prawdopodobnie nie chcesz, to: git rm --cached
. Zachowa twój plik lokalny, ale zostanie oznaczony jako usunięty ze zdalnego repozytorium.)
Różnica między dwoma pierwszymi opcjami?
-
{[3] } jest tymczasowym pozwoleniem na ukrywanie modyfikacji z pliku. Jeśli chcesz aby ukryć modyfikacje wykonane w pliku, zmodyfikować plik, a następnie sprawdzić inną gałąź, będziesz musiał użyć
no-assume-unchanged
, a następnie prawdopodobnie zmodyfikować stash. -
skip-worktree
podąży za tobą bez względu na gałąź, którą kasujesz, z Twoimi modyfikacjami!
Przypadek użycia assume-unchanged
Zakłada, że ten plik nie powinien być modyfikowany i daje czystsze wyjście podczas wykonywania git status
. Ale podczas sprawdzania w innej gałęzi, musisz zresetować flagę i zatwierdzić lub ukryć zmiany wcześniej. Jeśli pociągniesz z tą opcją aktywną, będziesz musiał rozwiązać konflikty, a git nie będzie automatycznie scalał. W rzeczywistości ukrywa tylko modyfikacje (git status
nie pokaże Ci oznaczonych plików).
Lubię go używać, gdy chcę tylko zatrzymać śledzenie zmian na chwilę + zatwierdzić kilka plików (git commit -a
) związanych z tą samą modyfikacją .
Przypadek użycia skip-worktree
Masz klasę setup zawierającą parametry (np. włącznie z hasłami), że Twoi znajomi muszą zmienić się odpowiednio do ich konfiguracji.
- 1: Utwórz pierwszą wersję tej klasy, wypełnij pola, które możesz wypełnić i pozostaw inne puste / null.
- 2: Zatwierdź i wypchnij go na zdalny serwer.
- 3:
git update-index --skip-worktree MySetupClass.java
- 4: zaktualizuj klasę konfiguracji o własne parametry.
- 5: wróć do pracy nad inną funkcjonalnością.
Modyfikacje, które wykonasz, podążą za Tobą niezależnie od gałęzi. Uwaga: jeśli Twoi znajomi również chcą zmodyfikować ta klasa musi mieć taką samą konfigurację, w przeciwnym razie ich modyfikacje zostaną wypchnięte do zdalnego repozytorium. Podczas pobierania zdalna Wersja pliku powinna zastąpić Twoją.
PS: zrób jedno lub drugie, ale nie oba, ponieważ będziesz miał niepożądane skutki uboczne. Jeśli chcesz wypróbować inną flagę, powinieneś najpierw wyłączyć tę ostatnią.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-17 16:25:06
Aby zapobiec monitorowaniu pliku przez git
git update-index --assume-unchanged [file-path]
I aby przywrócić go z powrotem użyj
git update-index --no-assume-unchanged [file-path]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-18 09:41:40
Aby powiedzieć Gitowi, aby nie śledził zmian w Twoim lokalnym pliku/folderze (co oznacza, że git status nie wykryje zmian w nim), wykonaj:
git update-index --skip-worktree path/to/file
I aby powiedzieć Gitowi, aby ponownie śledził zmiany w Twojej lokalnej wersji (abyś mógł zatwierdzić zmiany), wykonaj:
git update-index --no-skip-worktree path/to/file
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-12 22:10:25
Zakładam, że pytasz, Jak usunąć wszystkie pliki w określonym folderze lub folderze bin, zamiast zaznaczać każdy plik osobno.
Możesz użyć tego polecenia:git rm -r -f /<floder-name>\*
Upewnij się, że znajdujesz się w katalogu nadrzędnym tego katalogu.
Polecenie to rekurencyjnie "usunie" wszystkie pliki znajdujące się w katalogach bin/ lub build/. Przez słowo delete mam na myśli, że git będzie udawał, że te pliki są "usunięte", a te pliki nie będą śledzone. Git naprawdę oznacza te pliki, aby były w trybie delete.
Upewnij się, że masz swoje .gitignore gotowy na nadchodzące commity.
dokumentacja: git RM
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-06 13:47:02
Problem może być spowodowany kolejnością działania. Jeśli zmodyfikowałeś .najpierw gitignore, potem git RM --cached xxx, być może nadal będziesz musiał napotkać ten problem.
Poprawne rozwiązanie:
- git RM --cached xxx
- zmodyfikowano .gitignore
Porządek niezmienny!
The .gitignore reload po modyfikacji!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-24 17:05:36
Zakładam, że próbujesz usunąć pojedynczy plik z Gita. w tym celu polecam poniższe polecenie.
Git update-index --assume-unchanged
Ex-Git update-index --assume-unchanged .gitignore .idea / kompilator.xml
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-04 17:04:12
Aby zignorować wszelkie zmiany we wszystkich plikach (określonego typu) w katalogu, musiałem połączyć niektóre z tych podejść, w przeciwnym razie pliki zostały utworzone, jeśli wcześniej nie istniały.
Poniżej "excludedir" to nazwa katalogu, w którym nie chcę oglądać zmian.
Najpierw usuń wszystkie istniejące nowe pliki z pamięci podręcznej śledzenia zmian (bez usuwania z systemu plików).
git status | grep "new file:" | cut --complement -d " " -f1-4 | grep "^excludedir" | xargs git rm --cache
Możesz zrobić to samo z modified:
. renamed:
jest nieco bardziej skomplikowane, ponieważ musisz spojrzeć na Bit post ->
dla nowej nazwy pliku i wykonać bit pre ->
, jak opisano poniżej dla deleted:
.
deleted:
pliki są nieco bardziej skomplikowane, ponieważ nie można zaktualizować indeksu dla pliku, który nie istnieje w systemie lokalnym
echo .deletedfiles >> .gitignore
git status | grep "deleted:" | cut --complement -d " " -f1-4 | grep "^excludedir" > .deletedfiles
cat .deletedfiles | xargs -d '\n' touch
cat .deletedfiles | xargs -d '\n' git add -f
cat .deletedfiles | xargs -d '\n' git update-index --assume-unchanged
cat .deletedfiles | xargs -d '\n' rm
Ostatnie polecenie z powyższej listy usunie pliki ponownie z twojego systemu plików, więc nie krępuj się tego pominąć.
Następnie zablokuj śledzenie zmian z tego katalogu
git ls-files excludedir/ | xargs git update-index --skip-worktree
git update index --skip-worktree excludedir/
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-26 00:05:11