Mam repozytorium git, które służy tylko do przechowywania plików graficznych i dźwiękowych używanych w kilku projektach. Wszystkie znajdują się w jednym katalogu bez podkatalogów. Teraz właśnie utworzyłem skrypt do kopiowania tych zasobów z innego uporządkowanego katalogu z kilkoma poziomami podkatalogów.
Teraz chcę tylko (źródłową) hierarchiczną strukturę plików śledzoną przez git, a (docelowy) płaski katalog (ze wszystkimi plikami w jednym stosie) powinien zostać zignorowany.
Dodałem katalog docelowy do .gitignore, ale git wciąż śledzi w nim zmiany. Pomyślałem, że jeśli popełnię usunięcie starego pliku w katalogu docelowym, git może przestać śledzić nową zawartość (skopiowaną przez skrypt), ale tak nie jest.
Jak sprawić, by git zapomniał o katalogu docelowym?
źródło
Odpowiedzi:
To polecenie spowoduje, że git wyśledzi twój katalog i wszystkie znajdujące się w nim pliki bez ich usuwania:
git rm -r --cached <your directory>
Ta
-r
opcja powoduje usunięcie wszystkich plików z katalogu.Ta
--cached
opcja powoduje, że pliki są usuwane tylko z indeksu git, a nie z kopii roboczej. Domyślniegit rm <file>
zostanie usunięty<file>
.źródło
add -f
lub w zależności od sytuacji. Jak powiedział Gordon, zapobiega to przypadkowemu usunięciu kilku plików - repozytorium jest listą główną, a nie gitignore. Pozwala to również ręcznie śledzić kilka rzeczy, które w przeciwnym razie zostałyby zignorowane przez regułę wieloznaczną, co uważam za przydatne.-r
opcja nie jest „powoduje usunięcie wszystkich plików na podstawie katalogu”, ale raczej rekursja poprzez podkatalogu.Jeśli potrzebujesz pliku śledzonego (zameldowanego), ale nie chcesz śledzić dalszych zmian pliku, jednocześnie przechowując go w lokalnym repozytorium, a także w zdalnym repozytorium, można to zrobić za pomocą:
Następnie wszelkie zmiany w tym pliku nie będą już wyświetlane w
git status
.źródło
git update-index --no-assume-unchanged dirname/**/*
W przypadku podkatalogu o nazwie
blah/
dodanej do git oba poniższe wydają się działać, aby zignorować nowe pliki wblah/
. Dodano do .gitignore:źródło
TL; DR, aby wyczyścić repozytorium git i upewnić się, że WSZYSTKIE zignorowane elementy są rzeczywiście ignorowane:
Uwaga: nie musisz określać katalogu, w ten sposób czyścisz całe zdalne repozytorium .
Aby przejść dalej, przeczytaj to
źródło
Nie jestem pewien, czy to się liczy, czy czyni mnie złym człowiekiem, ale proszę bardzo.
*Generated*
do głównego pliku .gitignoredir *.CheckedIn -Recurse | %{ copy $_.FullName "$($_.FullName)".Replace("CheckedIn","") -EA SilentlyContinue}
Czuję się trochę źle z siebie ... ale w rzeczywistości to działa.
źródło
Ok, wygląda na to, że najpierw musisz dokonać odprawy z całkowicie pustym katalogiem (ani starych, ani nowych plików), a wszystkie pliki dodane później zostaną zignorowane. Jeśli usuniesz stare pliki dodaj i nowe przed zatwierdzeniem, nowe zostaną dodane do repozytorium, chociaż należy je zignorować.
Przynajmniej działało to dla mnie w tej sytuacji. Byłoby świetnie, gdyby ktokolwiek mógł uzyskać lepszy wgląd w to, co się dzieje.
źródło