Sklonowałem projekt, który zawiera niektóre .csproj
pliki. Nie potrzebuję / nie lubię, aby moje lokalne csproj
pliki były śledzone przez Git (lub wychowywane podczas tworzenia łatki), ale najwyraźniej są one potrzebne w projekcie.
Dodałem *.csproj
do mojego LOCAL .gitignore
, ale pliki są już w repozytorium.
Kiedy wpisuję status git, pokazuje moje zmiany, csproj
których nie jestem zainteresowany śledzeniem lub przesyłaniem poprawek.
Jak usunąć „śledzenie” tych plików z mojego osobistego repozytorium (ale zachować je w źródle, aby móc z nich korzystać), aby nie widziałem zmian, kiedy wykonuję status (lub tworzę łatkę)?
Czy istnieje poprawny / kanoniczny sposób poradzenia sobie z tą sytuacją?
.csproj
pliku, który jest bardzo ważną częścią każdego projektu. Zmiany w.csproj.user
pliku lub dowolnych.Publish.XML
plikach Całkowicie rozumiem brak śledzenia, ale jestem zaintrygowany, dlaczego nie chcesz śledzić.csproj
…Odpowiedzi:
Po prostu wywołanie
git rm --cached
każdego pliku, który chcesz usunąć z kontroli wersji, powinno być w porządku. Tak długo, jak lokalne wzorce ignorowania nie są poprawne, nie zobaczysz tych plików na wyjściu statusu git.Zauważ, że to rozwiązanie usuwa pliki z repozytorium, więc wszyscy programiści musieliby utrzymywać własne lokalne (niekontrolowane) kopie pliku
Aby zapobiec wykrywaniu zmian w tych plikach przez git, powinieneś również użyć tego polecenia:
Co prawdopodobnie chcesz zrobić: (od dołu odpowiedź @Ryan Taylor )
Pełna odpowiedź znajduje się tutaj: http://source.kohlerville.com/2009/02/untrack-files-in-git/
źródło
git ls-files | xargs git rm --cached
- spowoduje to usunięcie wszystkiego z indeksu git w danym katalogu bez usuwania rzeczywistych plików.git rm --cached -r <dir>
działa rekurencyjnie na folder i wszystkie pliki w nim zawarte.Jeśli to zrobisz
git update-index --assume-unchanged file.csproj
, git nie sprawdzi automatycznie pliku.csproj pod kątem zmian: spowoduje to, że nie pojawią się one w stanie git przy każdej zmianie. Możesz w ten sposób oznaczyć wszystkie swoje pliki .csproj - chociaż będziesz musiał ręcznie oznaczyć wszystkie nowe, które wyśle do ciebie repozytorium. (Jeśli masz je w swoim.gitignore
lub.git/info/exclude
, to te, które utworzysz, zostaną zignorowane)Nie jestem do końca pewien, czym są pliki .csproj ... jeśli są czymś podobnym do konfiguracji IDE (podobnej do plików .eclipse i .classpath w Eclipse), to sugeruję, że po prostu nigdy nie powinny być kontrolowane przez źródło wszystko. Z drugiej strony, jeśli są częścią systemu kompilacji (jak Makefiles), to oczywiście powinny --- i przydatny byłby sposób na pobranie opcjonalnych zmian lokalnych (np. Z pliku local.csproj a la config.mk) : podziel nagromadzenie na części globalne i lokalne przesłonięcia.
źródło
.csproj
?git ls-files -v
pokaże pliki, które są zakładane w niezmienionej postaci, ze wskaźnikiem małych liter (np.h
Zamiast zwykłychH
plików buforowanych).Istnieją 3 opcje, prawdopodobnie chcesz # 3
1. Pozwoli to zachować plik lokalny dla Ciebie, ale usunie go dla każdego innego, gdy go ściągną.
git rm --cached <file-name>
lubgit rm -r --cached <folder-name>
2. Ma to na celu optymalizację, podobnie jak folder z dużą liczbą plików, np. Zestawy 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 go miał.
assume-unchanged
Indeksu zostaną zresetowane i plik (i) nadpisane jeśli istnieją upstream zmiany do pliku / folderu (można wyciągnąć).3. Ma to na celu poinformowanie gita, że chcesz mieć własną niezależną wersję pliku lub folderu. Na przykład nie chcesz zastępować (lub usuwać) plików konfiguracyjnych produkcji / przemieszczania.
Ważne jest, aby wiedzieć, że
git update-index
nie będzie się ono rozprzestrzeniać za pomocą git i każdy użytkownik będzie musiał uruchomić go niezależnie.źródło
grep
igit ls-files
it gives me error that your local changes would be overwritten
ściągam kod z repozytorium git origin w tych 2 plikach, to znaczy, że nie jest to śledzenie, prawda?Jest to proces dwuetapowy:
Usuń śledzenie pliku / folderu - ale zachowaj je na dysku - używając
Teraz nie pojawiają się jako „zmienione”, ale nadal pokazują się jako
Dodaj je do
.gitignore
źródło
Przyjęta odpowiedź wciąż nie działała dla mnie
użyłem
Znalazłem odpowiedź stąd
źródło
Zapomniałeś swojego .gitignore?
Jeśli masz cały projekt lokalnie, ale zapomniałeś go dodać, zignoruj i śledzisz teraz niektóre niepotrzebne pliki, użyj tego polecenia, aby usunąć wszystko
upewnij się, że jesteś u podstaw projektu.
Następnie możesz zrobić to, co zwykle
Dodaj
Popełnić
Pchać
Wniosek
Mam nadzieję, że to pomaga ludziom, którzy muszą wprowadzić zmiany w swoim
.gitignore
lub zapomnieli o tym wszystkim razem.źródło
Jak wskazano w innych odpowiedziach, wybrana odpowiedź jest błędna.
Odpowiedź na inne pytanie sugeruje, że może to być Skip-worktree które byłyby wymagane.
źródło
--skip-worktree
służy do przechowywania pliku w repozytorium, ale przestaje śledzić jego zmiany . Jako odpowiedź mówi: --skip-worktree jest przydatna, gdy nie pouczać git dotknąć plik specyficzny kiedykolwiek ponieważ programiści powinni to zmienić--assume-unchanged
i--skip-worktree
mają podobny efekt, ale ich cele są zupełnie inne. Pierwszy służy do przyspieszenia działania gita przez oszukanie gita, aby nie sprawdzał poszczególnych plików , a drugi do ignorowania przyszłych zmian w poszczególnych plikach , które są odpowiednie dla środowiska wykonawczego, ale niezbędne pliki.Aby zaoszczędzić trochę czasu, reguły dodane do .gitignore można wykorzystać do usunięcia wielu plików / folderów, tj
git rm --cached app/**/*.xml
lub
git rm --cached -r app/widgets/yourfolder/
itp
źródło
Aby zapobiec monitorowaniu pliku przez git
Aby przywrócić, użyj go ponownie
Repozytorium do odniesienia w podobnych przypadkach użycia https://github.com/awslabs/git-secrets
źródło
Wiele osób zaleca używanie
git update-index --assume-unchanged
. Rzeczywiście może to być dobre rozwiązanie, ale tylko w krótkim okresie.Co prawdopodobnie chcesz zrobić to w ten sposób:
git update-index --skip-worktree
.(Trzecią opcją, której prawdopodobnie nie chcesz, jest
git rm --cached
:. Zachowa twój plik lokalny, ale zostanie oznaczony jako usunięty ze zdalnego repozytorium.)Różnica między dwiema pierwszymi opcjami?
assume-unchanged
ma tymczasowo pozwolić ci ukryć modyfikacje przed plikiem. Jeśli chcesz ukryć modyfikacje dokonane w pliku, zmodyfikować plik, a następnie wyewidencjonować inną gałąź, będziesz musiał użyć,no-assume-unchanged
a następnie prawdopodobnie ukrytych modyfikacji zrobionych.skip-worktree
podąży za tobą niezależnie od gałęzi, którą zamawiasz, wraz ze swoimi 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 innym oddziale musisz zresetować flagę i zatwierdzić lub ukryć zmiany przedtem. Jeśli wyciągniesz z włączoną tą opcją, będziesz musiał rozwiązać konflikty i git nie będzie automatycznie scalał. W rzeczywistości ukrywa tylko modyfikacje (git status
nie pokazuje oznaczonych plików).Lubię go używać, gdy chcę zatrzymać na chwilę śledzenie zmian + zatwierdzić kilka plików (
git commit -a
) związanych z tą samą modyfikacją.Przypadek użycia
skip-worktree
Masz klasę konfiguracji zawierającą parametry (np. W tym hasła), które Twoi znajomi muszą zmienić zgodnie z ich konfiguracją.
git update-index --skip-worktree MySetupClass.java
Modyfikacje, które wprowadzisz, podążą za tobą niezależnie od branży. Ostrzeżenie: jeśli Twoi znajomi również chcą zmodyfikować tę klasę, muszą 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: wykonaj jedną lub drugą, ale nie obie, ponieważ będziesz mieć niepożądane skutki uboczne. Jeśli chcesz wypróbować inną flagę, najpierw wyłącz tę drugą.
źródło
Aby powiedzieć Gitowi, aby nie śledził zmian w lokalnym pliku / folderze (co oznacza, że status git nie wykryje zmian w nim):
Aby powiedzieć Gitowi, aby ponownie śledził zmiany w lokalnej wersji (abyś mógł zatwierdzić zmiany):
źródło
odpowiedź w jednej linii
git update-index --assume-unchanged [path]
Użyj tego, gdy masz plik, który znajduje się w centralnym repozytorium, a także w repozytorium lokalnym. Musisz wprowadzić zmiany w tym pliku, ale nie można go przemieszczać / zatwierdzać w centralnym repozytorium. Ten plik nie powinien być dodawany
.gitignore
. ponieważ nowe zmiany w pliku, jeśli zostaną wprowadzone przez administratorów systemu, starsi programiści muszą zostać rozdzieleni między wszystkie repozytoria lokalne.Najlepszy przykład: plik konfiguracyjny dla połączeń DB . W centralnym repozytorium będziesz mieć całą nazwę użytkownika, hasło, host, port z wartościami produkcyjnego serwera DB. Ale w lokalnym deweloperze powinieneś używać tylko lokalnego lub dowolnego innego deweloperskiego serwera DB (skonfigurowanego przez zespół). W takim przypadku chcesz wprowadzić zmiany w pliku konfiguracyjnym, ale nie powinieneś być przypisany do centralnego repozytorium.
Najlepsza
źródło
Zakładam, że pytasz, jak usunąć WSZYSTKIE pliki w określonym folderze lub folderze bin, zamiast wybierać poszczególne pliki osobno.
Możesz użyć tego polecenia:
git rm -r -f /<floder-name>\*
Upewnij się, że znajdujesz się w katalogu nadrzędnym tego katalogu.
To polecenie rekurencyjnie „usunie” wszystkie pliki znajdujące się w folderach bin / lub build /. Przez słowo „usuń” rozumiem, że git będzie udawał, że te pliki są „usuwane”, a te pliki nie będą śledzone. Git naprawdę zaznacza te pliki w trybie usuwania.
Upewnij się, że masz .gitignore gotowy na nadchodzące zmiany.
Dokumentacja: git rm
źródło
Problem może być spowodowany kolejnością działania. Jeśli najpierw zmodyfikowałeś .gitignore, a następnie git rm --cached xxx, być może będziesz musiał napotkać ten problem.
Prawidłowe rozwiązanie :
Zamów niezmienny!
.Gitignore przeładowuje po modyfikacji!
źródło
Zakładam, że próbujesz usunąć pojedynczy plik z narzędzia git tacking. do tego polecam poniżej polecenia.
git update-index --assume-niezmieniony
Ex - git update-index --assume-unchanged .gitignore .idea / compiler.xml
źródło
Aby zignorować wszelkie zmiany wszystkich plików (określonego typu) w katalogu, musiałem połączyć niektóre z tych podejść, w przeciwnym razie pliki zostałyby utworzone, jeśli wcześniej nie istniały.
Poniżej „excelir” 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).
Możesz zrobić to samo z
modified:
.renamed:
jest nieco bardziej skomplikowane, ponieważ musisz spojrzeć na->
bit postu dla nowej nazwy pliku i wykonać->
bit wstępny, jak opisanodeleted:
poniżej.deleted:
pliki są nieco bardziej skomplikowane, ponieważ wydaje się, że nie można zaktualizować indeksu dla pliku, który nie istnieje w systemie lokalnymOstatnie polecenie z powyższej listy usunie pliki ponownie z systemu plików, więc możesz je pominąć.
Następnie zablokuj śledzenie zmian w tym katalogu
źródło
W tej odpowiedzi podano podejście prawie bez gitów :
Aby zignorować niektóre pliki dla każdego lokalnego repozytorium :
~/.gitignore_global
, np. Przeztouch ~/.gitignore_global
w swoim terminalu.git config --global core.excludesfile ~/.gitignore_global
raz.~/.gitignore_global
. np.modules/*.H
który będzie zakładany w twoim katalogu roboczym, tj$WORK_DIR/modules/*.H
.Aby zignorować niektóre pliki dla jednego lokalnego repozytorium :
.git/info/exclude
w repozytorium, czyli zapisz ścieżki do pliku / katalogu, które chcesz zignorować.git/info/exclude
. np.modules/*.C
który będzie zakładany w twoim katalogu roboczym, tj$WORK_DIR/modules/*.C
.źródło
Zastosuj .gitignore do teraźniejszości / przyszłości
Jeśli musisz również usunąć nowo zignorowane pliki z historii zatwierdzeń oddziału lub jeśli nie chcesz, aby nowo zignorowane pliki zostały usunięte z przyszłych operacji pobierania , zapoznaj się z tą odpowiedzią .
źródło
po długim szukaniu znajdź sposób, aby to zrobić. alias polecenia git w.
.gitconfig
jak w projekcie Android Studio, przed kasą przywróć plik konfiguracyjny, a następnie pomiń go, po kasie użyjsed
zmiany pliku konfiguracyjnego na moją konfigurację lokalną.checkoutandmodifylocalproperties = !git update-index --no-skip-worktree local.properties && git checkout local.properties && git checkout $1 && git update-index --skip-worktree local.properties && sed -i '' 's/.*sdk.dir.*/sdk.dir=\\/Users\\/run\\/Library\\/Android\\/sdk/g' local.properties && :
źródło