Pytanie Usuń plik z repozytorium Git bez usuwania go z lokalnego systemu plików


Moje pierwsze zatwierdzenie zawierało kilka plików dziennika. dodałem *log do mojego .gitignore, a teraz chcę usunąć pliki dziennika z mojego repozytorium.

git rm mylogfile.log

usunie plik z repozytorium, ale usunie go również z lokalnego systemu plików.

Jak mogę usunąć ten plik z repozytorium bez usunięcie mojej lokalnej kopii pliku?


2439
2017-07-17 14:56


pochodzenie


Duplikat Przestań śledzić i ignoruj ​​zmiany w pliku w Git


Odpowiedzi:


Dla pojedynczego pliku:

git rm --cached mylogfile.log

Dla pojedynczego katalogu:

git rm --cached -r mydirectory

3508
2017-07-17 14:57



Dzięki! Nie jestem pewien, jak ominąłem to w człowieku ... "Po podaniu opcji --cached, zawartość etapowa musi pasować do końcówki gałęzi lub pliku na dysku, umożliwiając usunięcie pliku tylko z indeksu . " - mveerman
może dlatego, że nie jest tak samo oczywiste jak --keep-local. - Martin
@DGGenuine, --keep-local jest argumentem dla svn rm - bdonlan
@bdonian dzięki. Musi być opcja do nowej wersji git-rm. Jak na ironię ta strona jest najlepszym wynikiem podczas wyszukiwania w Google "git rm" --keep-local '" - Carl G
Ale w jaki sposób mogę zachować pliki na zdalnych serwerach? Zachowuje to lokalny, ale jeśli będę naciskać i pobierać z innego serwera, plik zostanie usunięty. Dodałem również plik .gitignore do pliku, ale nadal jest on usuwany - spankmaster79


Aby usunąć cały folder z repozytorium (jak pliki Resharper), wykonaj następujące czynności:

git rm -r --cached folderName

Zrobiłem kilka plików resharperów i nie chciałem, aby te trwały dla innych użytkowników projektu.


249
2018-04-04 18:14



To tylko dodatkowa uwaga dla przyszłych użytkowników: nie używaj GUI do "Synchronizowania" zatwierdzenia z powrotem do repozytorium. To spowoduje wycofanie plików z powrotem do lokalnego repozytorium. Musisz zrobić Git Push repo branch faktycznie usunąć pliki z pilota. - RubberDuck
@RubberDuck Odpowiedź 3 lata i jedyne rozwiązanie, które zadziałało dla mnie :) Dzięki - Mariusz


Możesz również usunąć pliki z repozytorium na podstawie pliku .gitignore bez usuwania ich z lokalnego systemu plików:

git rm --cached `git ls-files -i -X .gitignore`

Lub alternatywnie w Windows Powershell:

git rm --cached $(git ls-files -i -X .gitignore)

163
2018-01-31 10:05



Nie działa w systemie Windows. git ls-files -i -X ​​.gitignore działa, ale nie wiem jak wysłać pliki do 'git rm'. Czy wiesz, jak to zrobić? - Erik Z
Działa w systemie Windows, jeśli używasz Git Bash zamiast konsoli cmd - Andreas Zita
Kocham to. Pracowałam z wyjątkiem tego, że miałem kilka plików, które kończyły się spacjami w nazwie pliku. Zmodyfikowałem rozwiązanie tutaj: git ls-files -i -X .gitignore | xargs -I{} git rm --cached "{}". Proszę rozważyć modyfikację lub dodanie tego rozwiązania do odpowiedzi tutaj, ponieważ jest to wspaniałe narzędzie do ... - mpettis
Nie próbowałem, ale powinno być przetestowane usunie również pliki takie jak .gitkeep która zachowuje pusty folder w repozytorium. Na przykład. .gitignore zawierają folder uploads repo jest zmuszony do śledzenia .gitkeep. Usuwając wszystko z repo w ramach uploads to również usunie .gitkeep. - Vladimir Vukanac
Uwaga: nie działa z zagnieżdżonymi plikami .gitignore - acidjunk


Ponadto, jeśli przekazałeś dane poufne (np. Plik zawierający hasła), powinieneś całkowicie usunąć go z historii repozytorium. Oto przewodnik wyjaśniający, jak to zrobić: http://help.github.com/remove-sensitive-data/


66
2017-08-21 12:16



Ta odpowiedź powinna zawierać wymagane polecenia do wykonania tego zadania zamiast łączenia z inną witryną. - Florian Lemaitre


Zgodnie z moją odpowiedzią tutaj: https://stackoverflow.com/questions/6313126/how-to-remove-a-directory-in-my-github-repository

Aby usunąć folder / katalog lub plik tylko z repozytorium git, a nie z lokalnego spróbuj wykonać 3 proste kroki.


Kroki, aby usunąć katalog

git rm -r --cached File-or-FolderName
git commit -m "Removed folder from repository"
git push origin master

Kroki, aby zignorować ten folder przy kolejnych zatwierdzeniach

Aby zignorować ten folder od następnego zatwierdzenia, należy utworzyć jeden plik w katalogu głównym o nazwie .gitignore   i umieść w nim nazwę folderu. Możesz umieścić tyle, ile chcesz

.gitignore plik będzie wyglądał tak

/FolderName

remove directory


58
2017-08-24 12:16



Z ciekawości, w jaki sposób zamazywałeś? - kmort
@kmort Haha, zrobiłem to za pomocą narzędzia "Fantastyczny zrzut ekranu" przeglądarki Google Chrome, było naprawdę szybkie, dlatego wyglądałem niechlujnie. Przepraszam za to!! awesomescreenshot.pl - eirenaios


Bardziej ogólne rozwiązanie:

  1. Edytować .gitignore plik.

    ECHO mylogfile.log >> .gitignore

  2. Usuń wszystkie elementy z indeksu.

    git rm -r -f --cached .

  3. Przebuduj indeks.

    git add .

  4. Dokonaj nowego zatwierdzenia

    git commit -m "Removed mylogfile.log"


54
2017-12-13 11:42



Czy to faktycznie usunie plik? - Mr_and_Mrs_D
Od GitHub? NIE. Jeśli już zostałeś popchnięty do github, nie usuniesz go z witryny. Ale zaktualizuje twoje lokalne repozytorium git. - mAsT3RpEE
Myślę, że chcesz tego: help.github.com/articles/remove-sensitive-data - mAsT3RpEE
Skasowany komentarz został w rzeczywistości bardziej wyeliminowany :) Problem z rozwiązaniem rm --cashed jest to, że ostatecznie usunie plik, gdy ktoś go pociągnie - prawda? A tego nie chcą ludzie, gdy mówią "Usuń plik z repozytorium bez usuwania go z lokalnego systemu plików"Dlaczego więc powyższe rozwiązanie było poza mną - prawdopodobnie OP działał sam i nigdy nie ciągnął?" Dunno, rozumiem kwestię github "raz pchano zawsze tam" ofc - Mr_and_Mrs_D
Moim problemem nie jest github - to jest to plik zostanie usunięty ze współpracowników po ich pobraniu. ja nie rób tego chcę, aby plik został usunięty. To spowodowało mi ogromne problemy w przeszłości. Tak więc zastanawiałem się, czy naprawdę istnieje takie rozwiązanie nie usuń plik. Zobacz także komentarz w zaakceptowanej odpowiedzi: stackoverflow.com/questions/1143796/... - Mr_and_Mrs_D


Git pozwala ignorować te pliki, zakładając, że są niezmienione. To   odbywa się poprzez uruchomienie git update-index --assume-unchanged path/to/file.txt dowództwo. Po oznaczeniu pliku jako takiego, git będzie   całkowicie ignorować wszelkie zmiany w tym pliku; nie pojawią się, kiedy   uruchomienie statusu git lub git diff, ani nigdy nie zostaną zatwierdzone.

(Od https://help.github.com/articles/ignoring-files)

Dlatego nie należy go usuwać, ale ignorować zmiany w nim na zawsze. Myślę, że to działa tylko lokalnie, więc współpracownicy wciąż mogą zobaczyć zmiany, chyba że wykonają to samo polecenie, co powyżej. (Nadal trzeba to sprawdzić.)

Uwaga: Nie odpowiada to bezpośrednio na pytanie, ale jest oparte na dalszych pytaniach w komentarzach innych odpowiedzi.


18
2018-01-28 11:46



Hm, robię to, ale widzę, że plik może zostać nadpisany, jeśli ktoś inny wprowadzi zmiany w repozytorium. - AlxVallejo


Powyższe odpowiedzi mi nie pasowały. Użyłem gałęzi filtra, aby usunąć wszystkie zatwierdzone pliki

usuń plik z repozytorium git za pomocą:

git filter-branch --tree-filter 'rm  file'

usuń folder z repozytorium git za pomocą:

git filter-branch --tree-filter 'rm -rf directory'

Spowoduje to usunięcie katalogu lub pliku ze wszystkich zatwierdzeń

możesz określić commit, używając:

git filter-branch --tree-filter 'rm -rf directory' HEAD

Lub zasięg

git filter-branch --tree-filter 'rm -rf vendor/gems' t49dse..HEAD

Aby odepchnąć wszystko na odległość, możesz:

git push origin master --force

4
2018-01-12 13:59



To w połączeniu z git rm -r --cached NAME to jest sztuczka, aby usunąć ją z lokalnego repozytorium git i uniemożliwić jej wpływ na każdego, kto ciągnie później (usuwając historię pliku lub katalogu z git.) - notbad.jpeg
To przepisuje historię git i musiałbyś naciskać - force after, to jest trochę poza zakresem z pytaniem. W publicznym repozytorium nie można tak po prostu zmienić linii historii, ponieważ każdy, kto już sklonował repozytorium, miałby problemy podczas ciągnięcia. - Guillaume Perrot
Dzięki, w końcu ktoś wyjaśnia dobrą starą metodę krok po kroku bez zewnętrznych narzędzi - realtebo