Ignorujesz zawartość katalogu już zarejestrowanego?


227

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?


Jaka jest nazwa katalogu i co umieściłeś w .gitignore
mmmmmm

1
Nazywam się DirNameIrrelevant, aw .gitignore próbowałem umieścić „DirNameIrrelevant”, „DirNameIrrelevant /” i „DirNameIrrelevant / *”
Felixyz

Odpowiedzi:


524

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 -ropcja powoduje usunięcie wszystkich plików z katalogu.

Ta --cachedopcja powoduje, że pliki są usuwane tylko z indeksu git, a nie z kopii roboczej. Domyślnie git rm <file>zostanie usunięty <file>.


Ach, dzięki. Bardzo przydatne, chociaż nie rozumiem, dlaczego powinno to być konieczne (dlaczego nie wystarczy dodać katalog w .gitignore?). Czy możesz mi powiedzieć, po co jest - buforowany?
Felixyz

pewnie. Zmodyfikowałem odpowiedź, aby opisać dwie opcje.
Gordon Wilson,

Jeśli chodzi o to, dlaczego jest to konieczne, mogę jedynie spekulować. Sądzę, że twórcy chcieli, aby wyśledzenie plików było jawne, aby zmniejszyć ryzyko błędnego wyśledzenia ważnych części twojego projektu. Wyobrażam sobie, że istnieją również przyczyny techniczne.
Gordon Wilson,

15
Gitignore służy do określania, jakie nieśledzone pliki Git będzie wiedział; nie ma wpływu na pliki, które są już śledzone. Jeśli użytkownik chce śledzić pliki zignorowane w inny sposób, git pozwala im. Można to zrobić za pomocą add -flub 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.
Cascabel

-ropcja nie jest „powoduje usunięcie wszystkich plików na podstawie katalogu”, ale raczej rekursja poprzez podkatalogu.
Mr

78

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

git update-index --assume-unchanged path/to/file.txt

Następnie wszelkie zmiany w tym pliku nie będą już wyświetlane w git status.


1
Chociaż OP mógł poprosić o katalog, właśnie tego szukałem - ignorując dalsze zmiany w jednym zaznaczonym pliku; dzięki!
sdaau

1
aby całkowicie zignorować katalog, użyj „git update-index --assume-unchanged dirName / *”.
Długo

1
Jak można to odwrócić?
Rhys,

3
@Rhys, aby to odwrócić:git update-index --no-assume-unchanged dirname/**/*
JobJob

3

W przypadku podkatalogu o nazwie blah/dodanej do git oba poniższe wydają się działać, aby zignorować nowe pliki w blah/. Dodano do .gitignore:

blah 
blah/*

1

TL; DR, aby wyczyścić repozytorium git i upewnić się, że WSZYSTKIE zignorowane elementy są rzeczywiście ignorowane:

git rm -r --cached .
git add .
git commit -m "Clean up ignored files"

Uwaga: nie musisz określać katalogu, w ten sposób czyścisz całe zdalne repozytorium .

Aby przejść dalej, przeczytaj to


0

Nie jestem pewien, czy to się liczy, czy czyni mnie złym człowiekiem, ale proszę bardzo.

  1. Dodałem *Generated*do głównego pliku .gitignore
  2. Pliki, które chcę zachować, przesłałem jako GeneratedFile.Whthing.ext. Zakwaterowany
  3. Zrobiłem haczyk na gitarze przy kasie, aby wywołać skrypt PowerShell robiąc to:

dir *.CheckedIn -Recurse | %{ copy $_.FullName "$($_.FullName)".Replace("CheckedIn","") -EA SilentlyContinue}

Czuję się trochę źle z siebie ... ale w rzeczywistości to działa.


-2

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.


1
Krótka wersja tego, co powiedzieliśmy gdzie indziej - gitignore wpływa na to, o czym git nie będzie śledził danych. Nie wpływa to na to, co zostanie zrobione z danymi, o których ci mówiłeś (np. Polecił je dodać do repozytorium).
Cascabel

Ma więc sens, że pliki, które były śledzone i teraz usunięte, powinny być śledzone jako takie, ale nadal nie ma dla mnie sensu, aby pliki dodane (jeśli zrobiono to przed następnym zatwierdzeniem) były śledzone, podczas gdy jeśli I 1) ignoruj, 2) usuń pliki, 3) zatwierdzaj, 4) dodaj nowy plik, nowe pliki nie są śledzone.
Felixyz
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.