używanie gitignore do ignorowania (ale nie usuwania) plików

98

Mam katalog tmp w repozytorium git, który chciałbym nadal istnieć, ale zostałbym zignorowany. Dodałem go do .gitignore, ale git statusnadal informuje mnie o zmianach w plikach w tym katalogu. Próbowałem git rm -r --cached, ale to usuwa go ze zdalnego repozytorium. Jak mogę zatrzymać śledzenie zmian w tym katalogu, ale nadal pozwolić mu istnieć? Muszę to również zrobić dla 1 pliku, ale zmiany w tym również pojawiają się git statuspo .gitignorenich. Co powinienem zrobić?

21312312
źródło
1
zapisz, jak dokładnie wygląda twój plik .gitignore?
kdehairy

Odpowiedzi:

183

Zamiast tego .gitignoremożesz zaktualizować lokalne repozytorium git, uruchamiając następujące polecenie:

git update-index --assume-unchanged <file>

W tym przypadku plik jest śledzony w repozytorium pochodzenia. Możesz go zmodyfikować w swoim lokalnym repozytorium, a git nigdy nie oznaczy go jako zmienionego. Przeczytaj więcej na:

ducin
źródło
22
Moja miłość do dupka właśnie się podwoiła.
Mark Fox
2
To powinna być akceptowana odpowiedź. Dzięki za link do tego.
Gowiem,
4
Czy istnieje sposób, aby przesłać to do zdalnego repozytorium?
Brian Ortiz
2
hmm wolałbym oznaczyć plik jako „to nie jest plik git, nigdy nie synchronizuj go z git, nawet w innym repozytorium”
fantastyczne
11
Możesz to cofnąć za pomocą git update-index --no-assume-unchanged <file>. Jeśli chcesz je wymienić git ls-files -v | grep '^h'.
Sanghyun Lee
12

Dokładnym celem jest ignorowanie zmian wprowadzonych w plikach przy jednoczesnym umożliwieniu im istnienia .gitignore. Więc dodanie plików (lub katalogów) do .gitignorejest jedyną rzeczą, którą musisz zrobić.

Ale twój problem polega na tym, że git już śledzi pliki, które chcesz zignorować i .gitignorenie ma zastosowania do śledzonych plików. Jedynym sposobem na zatrzymanie tego śledzenia jest poinformowanie git o ich usunięciu. Używając git rm --cached, zapobiegasz usuwaniu plików lokalnych przez git, ale każde inne repozytorium, do którego otrzymasz zmiany, zastosuje usunięcie. Nie sądzę, aby można było tego uniknąć z własnego repozytorium. Musisz coś zrobić na innych repozytoriach lub zaakceptować, że pliki zostaną usunięte.

Aby zapobiec usuwaniu się w innym repozytorium, możesz:

  • (oczywiście) wykonaj kopię zapasową plików, ściągnij zmiany i przywróć pliki,
  • lub też git rm --cachedpliki i zatwierdź je przed ściągnięciem zmian. Git ładnie połączy dwie usunięcia bez dotykania już nieśledzonych plików.
Michaël Witrant
źródło
6
To nie musi być prawdą („zatrzymaj śledzenie = usuń plik”). Nadal można mieć plik śledzone w repo i nie widzi żadnych zmian, przy użyciu: git update-index --assume-unchanged <file>. Spójrz na: blog.pagebakers.nl/2009/01/29/…
ducin
to rozwiązało mój problem, ponieważ muszę usunąć plik z wypchniętego repozytorium w git, więc git rm --cached <filename> -r po tym wypchnięciu ponownie zmienia się repozytorium, więc plik jest usuwany
Vinicius Cardoso
7

Umieść znak /na końcu nazwy katalogu w swoim .gitignorepliku, tj

tmp/

Jeśli śledziłeś pliki w tym katalogu, musisz powiedzieć gitowi, aby najpierw o nich zapomniał (zanim dodasz katalog do listy ignorowanych). Zakładając, że nie masz tam nic istotnego (tj. Że możesz to porysować):

git rm -rf ./tmp/
git commit -m "untrack tmp dir"
mkdir tmp
echo tmp/ >> .gitignore
git add .gitignore ; git commit -m "add tmp/ to ignore list"

Nowe pliki w tym katalogu nie będą śledzone.

--cachedOpcja git rmdziała tylko na indeks (w trakcie zmiany bardziej lub mniej). Nie ma to wpływu na drzewo robocze ani status tego, co było śledzone lub nie.

Mata
źródło
Mam to. Zarówno the/dir/ithe/dir/*
21312312,
Hej Mat, czy mam coś takiego jak / Media w różnych folderach, które chciałbym zignorować, czy to możliwe? Więc jak / 1 / Media, / 2 / Media, aż do 99?
Nic,
1

Wygląda na to, że próbujesz śledzić plik (np. index.php), Dodać go do zdalnego repozytorium, a następnie przestać go śledzić, zachowując plik w zdalnym (tj. Zachowaj index.phpniezmieniony plik w zdalnym repozytorium, zmieniając go lokalnie).

Z tego, co rozumiem, git nie może tego zrobić. Możesz śledzić plik lub nie. Jeśli śledzisz plik, istnieje on w zdalnym repozytorium i zmienia się po zatwierdzeniu zmian. Jeśli nie śledzisz pliku, nie ma go w zdalnym repozytorium.

Ponieważ nie jest możliwe zrobienie dokładnie tego, co chcesz z git, istnieją potencjalnie inne rozwiązania, w zależności od konkretnej sytuacji. Na przykład, dlaczego nie chcesz index.phpzmieniać zdalnie, kiedy zmieniasz to lokalnie? Czy plik zawiera ustawienia specyficzne dla użytkownika? W takim przypadku możesz:

cp index.php index_template.php
git rm --cached index.php

Teraz edytuj plik index_template.php, aby wyglądał tak, jak chcesz, aby pojawił się w zdalnym repozytorium. Dodaj coś do swojego README, aby powiedzieć ludziom używającym twojego repozytorium, że po sklonowaniu go muszą skopiować plik index_template.php do index.php i edytować go zgodnie ze swoimi potrzebami.

git add index_template.php
git add README
git commit -m 'added template index.php file'
git push

Kiedy ktoś sklonuje Twoje repozytorium, musi utworzyć własne index.php. Zrobiłeś to dla nich łatwe: wystarczy skopiować index_template.phpdo index.phpi zweryfikować go z ustawieniami komputera szczególnych.

Cypress Frankenfeld
źródło