W tej chwili mam problem z repozytorium i chociaż mój Git-fu jest zwykle dobry, nie mogę go rozwiązać.
Kiedy sklonuję to repozytorium, a następnie cd
do repozytorium, git status
pokazuje kilka plików jako zmienionych. Uwaga: Nie otworzyłem repozytorium w żadnym edytorze ani niczym.
Próbowałem postępować zgodnie z tym przewodnikiem: http://help.github.com/dealing-with-lineendings/ , ale to wcale nie pomogło w moim problemie.
Próbowałem git checkout -- .
wiele razy, ale wydaje się, że nic nie robię.
Jestem na komputerze Mac i w samym repozytorium nie ma podmodułów.
System plików to „Journaled HFS +” na komputerze Mac i nie rozróżnia wielkości liter. Pliki są jednowierszowe i po około 79 KB każdy (tak, dobrze słyszałeś), więc patrzenie na git diff
nie jest szczególnie pomocne. Słyszałem o robieniu, git config --global core.trustctime false
co może pomóc, co spróbuję, gdy wrócę do komputera z repozytorium.
Zmieniłem szczegóły systemu plików o fakty! I spróbowałem git config --global core.trustctime false
sztuczki, która nie działała zbyt dobrze.
* text=auto
zrobić? Co to znaczy go usunąć.gitattributes
? Widzę, że to naprawia dla mnie ten problem, ale nie jestem pewien, dlaczego tak się dzieje, co tak naprawdę robi i jakie możliwe problemy to stwarza?git add
igit commit
który znormalizował plik i pozbyłem się problemu.git config --global core.autocrlf input
naprawiłem to dla mnie. Dzięki.Mam to. Wszyscy inni programiści korzystają z systemu Ubuntu (tak myślę), a zatem mają systemy plików z rozróżnianiem wielkości liter. Ja jednak tego nie robię (jak na komputerze Mac). Rzeczywiście, wszystkie pliki miały małe bliźniaki, kiedy na nie spojrzałem
git ls-tree HEAD <path>
.Poproszę jednego z nich, żeby to rozwiązał.
źródło
git ls-tree HEAD <path>
Pokazał jednak tylko jeden plik. Udało mi się jednak zobaczyć duplikaty plików w interfejsie GitHub.com, a także użyć tego interfejsu do usunięcia jednej wersji.rozwiązałem ten problem w moim przypadku
https://git-scm.com/docs/git-config
TL; DR;
core.fileMode
W przypadku wartości false różnice w wykonywalnych bitach między indeksem a drzewem roboczym są ignorowane; przydatne na uszkodzonych systemach plików, takich jak FAT. Zobacz git-update-index (1).
Domyślnie jest to prawda, z wyjątkiem tego, że git-clone (1) lub git-init (1) sondują i ustawią core.fileMode na false, jeśli to właściwe, podczas tworzenia repozytorium.
źródło
git diff
, zauważyłem, że zmiany były tylko w trybie plików. git podnosi,chmod -R 777 .
co było spowodowane, kiedy prowadziłem mój projekt, a ta konfiguracja pozwoliła mi zignorować zmiany chmod przez git stackoverflow.com/q/1580596/6207775Zakładam, że używasz systemu Windows. Ta strona GitHub, do której prowadzisz link, zawiera szczegóły wstecz. Problem polega na tym, że zakończenia linii CR + LF zostały już przypisane do repozytorium, a ponieważ w pliku core.autocrlf ustawiono wartość true lub input , Git chce przekonwertować zakończenia linii na LF, więc
git status
pokazuje, że każdy plik jest zmieniany.Jeśli jest to repozytorium, do którego chcesz tylko uzyskać dostęp, ale z którym nie masz żadnego związku, możesz uruchomić następujące polecenie, aby po prostu ukryć problem bez jego rozwiązania.
Jeśli jest to repozytorium, w które będziesz aktywnie uczestniczyć i możesz zatwierdzać zmiany. Możesz rozwiązać problem, wykonując zatwierdzenie, które zmienia wszystkie zakończenia linii w repozytorium, aby używało LF zamiast CR + LF, a następnie podejmuje kroki, aby zapobiec ponownemu wystąpieniu w przyszłości.
Poniższe informacje pochodzą bezpośrednio ze strony podręcznika gitattributes i powinny zostać wykonane z czystego katalogu roboczego.
Jeśli pojawią się pliki, które nie powinny być znormalizowane
git status
, przed uruchomieniem wyłącz ich atrybut tekstowygit add -u
.I odwrotnie, w plikach tekstowych, których Git nie wykrywa, można ręcznie włączyć normalizację.
źródło
git diff
pokazuje te pliki, któregit status
mówią , że są zmodyfikowane, a także jakiego systemu plików używasz?git config core.autocrlf false
było wystarczające). Oszukał nas fakt, że klient działa w systemie Linux (SL / RHEL), ale sesja Linux jest inicjowana przez x2go z hosta Windows. Może to być najbardziej prawdopodobne rozwiązanie w kontekście jednorodnym Win + Lin.Uruchom następujące polecenia. To może rozwiązać problem.
źródło
Jeśli używasz Git w Visual Studio, możesz automatycznie wygenerować pliki .gitignore i .gitattributes. Automatycznie wygenerowany plik .getattributes ma następujący wiersz:
Ta linia znajduje się w górnej części pliku. Musieliśmy tylko skomentować linię, dodając # z przodu. Po wykonaniu tej czynności wszystko działało zgodnie z oczekiwaniami.
źródło
Problem może również wynikać z różnych uprawnień do plików , tak jak w moim przypadku:
Świeżo sklonowane repozytorium (Windows, Cygwin):
Bare zdalne repozytorium (Linux):
źródło
Chciałem dodać odpowiedź bardziej ukierunkowaną na „Dlaczego” tak się dzieje, ponieważ już istnieje dobra odpowiedź na to, jak to naprawić.
Tak,
.gitattributes
ma* text=auto
ustawienie, które powoduje ten problem.W moim przypadku pliki w gałęzi głównej GitHub miały
\r\n
końcówki. Wywołałem ustawienia w repozytorium, aby dokonać odprawy z\n
zakończeniami. Nie wiem jednak, co Git sprawdza. Ma wypisywać się z natywnymi zakończeniami na moim Linux-ie (\n
), ale chyba wypisał plik z\r\n
zakończeniami. Git narzeka, ponieważ widzi wyrejestrowane\r\n
zakończenia znajdujące się w repozytorium i ostrzega mnie, że sprawdzi\n
ustawienia. Dlatego pliki należy „modyfikować”.Na razie to rozumiem.
źródło
Miałem ten sam problem. Również z komputerem Mac. Przeglądając repozytorium na komputerze z systemem Linux zauważyłem, że mam dwa pliki:
geoip.dat i GeoIP.dat
Usunąłem przestarzały na komputerze z systemem Linux i ponownie sklonowałem repozytorium na komputerze Mac. Nie mogłem wyciągać, zatwierdzać, ukrywać ani wyciągać z mojej kopii repozytorium, gdy były duplikaty.
źródło
Ten sam problem dla mnie. Widziałem kilka obrazów o tej samej nazwie, takich jak „textField.png” i „textfield.png” w zdalnym repozytorium Git, ale nie w moim lokalnym repozytorium. Mogłem zobaczyć tylko „textField.png”, który nie został użyty w kodzie projektu.
Okazuje się, że większość moich kolegów korzysta z systemu Ubuntu przy użyciu systemu plików ext4, a ja korzystam z komputera Mac z systemem APFS.
Dzięki odpowiedzi Sama Elliotta rozwiązanie było dość proste. Najpierw poprosiłem kolegę z Ubuntu, aby usunął zbędne wersje plików wielkimi literami, a następnie zatwierdził i wcisnął zdalnie.
Następnie wykonałem następujące czynności:
Wreszcie zdecydowaliśmy, że każdy programista powinien zmienić konfigurację Git, aby zapobiec powtórzeniu się tego problemu:
lub
źródło
upvoted
@ KDS męska odpowiedź !=
), ponieważ znajdzie się wignorecase = =
pliku konfiguracyjnym.Miałem też ten sam problem. W moim przypadku sklonowałem repozytorium i niektóre pliki natychmiast zniknęły.
Przyczyną było to, że ścieżka do pliku była zbyt długa dla systemu Windows. Aby rozwiązać ten problem, sklonuj repozytorium jak najbliżej katalogu głównego dysku twardego, aby skrócić długość ścieżki do pliku. Na przykład sklonuj go do
C:\A\GitRepo
zamiastC:\Users Documents\yyy\Desktop\GitRepo
.źródło
Edytuj plik o nazwie
.git/config
:Lub:
Zawartość
Zmień
filemode=true
nafilemode = false
.źródło
git config core.Filemode false
W przypadku nowych wersji systemu macOS może to być spowodowane funkcją zabezpieczeń systemu operacyjnego.
W repozytorium, nad którym pracowałem, był plik binarny o typie pliku * .app.
To tylko niektóre dane zserializowane, ale macOS traktuje wszystkie pliki * .app jako aplikację i ponieważ użytkownik nie pobrał tego pliku, system uznał go za niebezpieczny i dodał
com.apple.quarantine
atrybut pliku, który zapewnia, że plik nie może zostać wykonany.Ale ustawienie tego atrybutu na pliku również zmieniało plik i dlatego pojawił się w zestawie zmian Git bez możliwości przywrócenia go.
Możesz sprawdzić, czy masz ten sam problem, uruchamiając
$ xattr file.app
.Rozwiązanie jest dość proste, o ile nie musisz pracować z plikiem. Po prostu dodaj
*.app binary
do swojego.gitattributes
.źródło
Skopiowałem moje lokalne repozytorium do innego folderu i pojawiło się kilka zmodyfikowanych plików. Moje obejście: ukryłem zmodyfikowane pliki i usunąłem ukryty plik . Repozytorium stało się czyste.
źródło
Odkryłem, że Git traktuje moje pliki (w tym przypadku .psd) jako tekst. Ustawienie go na typ binarny w .gitattributes rozwiązało to.
źródło
Próbowałem zrobić interaktywny rebase, ale twierdził, że są jakieś zmodyfikowane pliki, więc nie pozwoli mi to teraz zrobić. Próbowałem wszystkiego, aby wrócić do czystego repozytorium, ale nic nie działało. Żadna z pozostałych odpowiedzi nie pomogła. Ale to w końcu zadziałało ...
Bum! Wyczyść repozytorium. Problem rozwiązany. Potem musiałem po prostu zrezygnować z ostatniego zatwierdzenia, kiedy to zrobiłem,
rebase -i
i wreszcie wszystko znów było czyste. Dziwaczny!źródło
Na wypadek, gdyby pomógł komuś innemu, może być inna przyczyna tego problemu: różne wersje Git. Używałem domyślnie zainstalowanej wersji Git na polu Ubuntu 18.04 (Bionic Beaver) i wszystko działało dobrze, ale kiedy próbowałem sklonować repozytorium przy użyciu Git na Ubuntu 16.04, niektóre pliki były wyświetlane jako zmodyfikowane.
Żadna z pozostałych odpowiedzi tutaj nie rozwiązała mojego problemu, ale uaktualnienie wersji Git w celu dopasowania w obu systemach naprawiło problem.
źródło