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ą?

 1460
git
Author: Rishabh, 2009-06-01

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 )

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

 1826
Author: anthony,
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)

Nie do końca wiem co .pliki csproj są... jeśli są czymś podobnym do konfiguracji IDE (podobnie jak Zaćmienie .zaćmienie i .pliki classpath) wtedy sugerowałbym, że po prostu nigdy nie powinny być kontrolowane przez źródła. Z drugiej strony, jeśli są częścią systemu budowania (jak pliki Makefile), to wyraźnie powinny--- i sposób na odebranie opcjonalnych zmian lokalnych (np. z lokalnego.csproj a la config.mk) przydałoby się: podzielić nagromadzenie na części globalne i lokalne.
 226
Author: araqnid,
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:

  1. 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  
    
  2. Dodaj je do .gitignore

 135
Author: rjha94,
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.

 119
Author: Ryan Taylor,
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

 79
Author: Buddhika Hasthanayake,
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
 38
Author: Joe Lloyd,
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.

 20
Author: Peter,
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>
 20
Author: the_new_mr,
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ą.

 5
Author: belka,
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]
 3
Author: shijin,
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
 3
Author: Ruto Collins,
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

 0
Author: Vraj Pandya,
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:

  1. git RM --cached xxx
  2. zmodyfikowano .gitignore

Porządek niezmienny!

The .gitignore reload po modyfikacji!

 0
Author: thearyong,
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

 0
Author: Pankaj Sonani,
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/
 0
Author: mpag,
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