Usuń katalog ze zdalnego repozytorium po dodaniu go do .gitignore
597
Popełniłem i wysłałem katalog do github. Następnie zmieniłem .gitignoreplik, dodając katalog, który należy zignorować. Wszystko działa dobrze, ale katalog (teraz ignorowany) pozostaje na github.
Jak usunąć ten katalog z github i historii repozytorium?
Reguły w Twoim .gitignorepliku dotyczą tylko plików nieśledzonych. Ponieważ pliki w tym katalogu zostały już zatwierdzone w Twoim repozytorium, musisz je wycofać, utworzyć zatwierdzenie i przekazać je do GitHub:
git rm -r --cached some-directory
git commit -m 'Remove the now ignored directory "some-directory"'
git push origin master
Nie możesz usunąć pliku ze swojej historii bez przepisania historii swojego repozytorium - nie powinieneś tego robić, jeśli ktoś inny pracuje z twoim repozytorium lub używasz go z wielu komputerów. Jeśli nadal chcesz to zrobić, możesz użyć git filter-branchdo przepisania historii - tutaj znajdziesz pomocny przewodnik .
Dodatkowo pamiętaj, że dane wyjściowe git rm -r --cached some-directorybędą takie jak:
@Labanino: -roznacza rekurencyjne, konieczne, jeśli robisz całe katalogi. --cachedzastępuje normalne zachowanie git polegające na usuwaniu ich z katalogu roboczego i ustawianiu usuwania w celu zatwierdzenia, i sprawia, że git działa tylko na obszarze testowym gotowym do zatwierdzenia. W ten sposób mówisz git, że chcesz zachować lokalne kopie plików.
Dzięki, bardzo mi to pomogło! Jeśli używasz Windows PowerShell, możesz to zrobićforeach ($i in iex 'git ls-files -i --exclude-from=.gitignore') { git rm --cached $i }
Kroki, aby zignorować ten folder w kolejnych zatwierdzeniach
Aby zignorować ten folder od następnych zatwierdzeń, utwórz jeden plik w katalogu głównym o nazwie .gitignore
i umieść w nim nazwę tego folderu. Możesz umieścić tyle, ile chcesz
Pierwsza odpowiedź Blundella nie zadziałała dla mnie. Jednak pokazało mi to właściwą drogę. Zrobiłem to samo:
> for i in `git ls-files -i --exclude-from=.gitignore`; do git rm --cached $i; done
> git commit -m 'Removed all files that are in the .gitignore'
> git push origin master
Radzę najpierw sprawdzić pliki do usunięcia, uruchamiając poniższą instrukcję:
git ls-files -i --exclude-from=.gitignore
Używałem domyślnego pliku .gitignore dla Visual Studio i zauważyłem, że usuwa on wszystkie foldery dziennika i bin w projekcie, co nie było moim zamierzonym działaniem.
Odpowiedź Blundella powinna zadziałać, ale z jakiegoś dziwnego powodu nie zadziałała ze mną. Musiałem najpierw potokować nazwy plików wyprowadzone przez pierwsze polecenie do pliku, a następnie przejść przez ten plik i usunąć go jeden po drugim.
git ls-files -i --exclude-from=.gitignore > to_remove.txt
while read line; do `git rm -r --cached "$line"`; done < to_remove.txt
rm to_remove.txt
git commit -m 'Removed all files that are in the .gitignore'
git push origin master
Ta metoda stosuje standardowe zachowanie .gitignore i nie wymaga ręcznego określania plików, które należy zignorować .
Nie można --exclude-from=.gitignorejuż używać : / - Oto zaktualizowana metoda:
Porady ogólne: zacznij od czystego repo - wszystko zostało popełnione, nic nie czeka w katalogu roboczym lub indeksie i wykonaj kopię zapasową !
#commit up-to-date .gitignore (if not already existing)#this command must be run on each branch
git add .gitignore
git commit -m "Create .gitignore"#apply standard git ignore behavior only to current index, not working directory (--cached)#if this command returns nothing, ensure /.git/info/exclude AND/OR .gitignore exist#this command must be run on each branch
git ls-files -z --ignored --exclude-standard | xargs -0 git rm --cached
#optionally add anything to the index that was previously ignored but now shouldn't be:
git add *#commit again#optionally use the --amend flag to merge this commit with the previous one instead of creating 2 commits.
git commit -m "re-applied modified .gitignore"#other devs who pull after this commit is pushed will see the newly-.gitignored files DELETED
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ą .
Czym git filter-branchróżni się używanie od używania git rm? Początkowo myślałem, że muszę użyć wersji, git filter-branchale większość komentarzy tutaj zaleca użycie git rm. Z tego co rozumiem, git rmusuwa to tylko z bieżącego katalogu roboczego i indeksu. Ale jeśli dodano wcześniej wiele zatwierdzeń, nadal będzie w repozytorium.
Dobrze. git rmusunie plik z ostatniego zatwierdzenia w przyszłości. git filter-branchpozwala nam usunąć go z całej historii. Zobacz także: help.github.com/articles/…
Używamy plików cookie i innych technologii śledzenia w celu poprawy komfortu przeglądania naszej witryny, aby wyświetlać spersonalizowane treści i ukierunkowane reklamy, analizować ruch w naszej witrynie, i zrozumieć, skąd pochodzą nasi goście.
Kontynuując, wyrażasz zgodę na korzystanie z plików cookie i innych technologii śledzenia oraz potwierdzasz, że masz co najmniej 16 lat lub zgodę rodzica lub opiekuna.