Pliki wyświetlane jako zmodyfikowane bezpośrednio po klonie Git


227

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 cddo repozytorium, git statuspokazuje 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 diffnie jest szczególnie pomocne. Słyszałem o robieniu, git config --global core.trustctime falseco 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 falsesztuczki, która nie działała zbyt dobrze.

Odpowiedzi:


141

Miałem ten sam problem na komputerze Mac po sklonowaniu repozytorium. Zakłada się, że wszystkie pliki zostały zmienione.

Po uruchomieniu git config --global core.autocrlf inputnadal oznaczał wszystkie pliki jako zmienione. Po szukaniu poprawki natknąłem się na .gitattributesplik w katalogu domowym, który miał następujące elementy.

* text=auto

Skomentowałem to i wszelkie inne sklonowane repozytoria odtąd działały dobrze.


5
Dzięki! W końcu znalazłem to po spędzeniu całego wieczoru na przełączaniu core.autocrlf i application.whitespace. To zadziałało. Dziękuję Ci.
xer0x

5
Obraźliwa linia w .gitattributes pochodzi z plików dot Mathiasa Bynena, na wypadek , gdyby ktokolwiek inny się z tym spotkał .
SeanPONeil

31
czy ktoś może rzucić więcej światła na tę konkretną konfigurację? Co ma * text=autozrobić? 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?
Dennis

6
@Dennis To ustawienie pomaga znormalizować zakończenia linii, więc usunięcie go prawdopodobnie nie jest właściwą odpowiedzią. Zobacz odpowiedź na to pytanie i ten artykuł . Odpowiedź @Arrowmaster poniżej była dla mnie bardziej pomocna. Użyłem git addi git commitktóry znormalizował plik i pozbyłem się problemu.
jtpereyda

4
git config --global core.autocrlf inputnaprawiłem to dla mnie. Dzięki.
dimiguel

89

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ł.


Czy kiedykolwiek to rozwiązali? Prawdopodobnie mam ten sam problem.
Josh Johnson

8
Tak, po prostu poproś kogoś z systemem plików, w którym rozróżniana jest wielkość liter, aby usunął wszystkie oprócz jednego z każdego zestawu plików, które miałyby zduplikowane nazwy plików w systemie plików bez rozróżniania wielkości liter.
Sam Elliott,

1
Właśnie natrafiłem na ten sam problem od czasu przejścia z Ubuntu na Mac. Dzięki, twoja odpowiedź trafiła w sedno. Mam nadzieję, że głosowanie popycha go do pierwszej pozycji. :-)
chmac

1
@Dirk dlatego istnieje wiele odpowiedzi. Zaakceptowałem ten, który miał zastosowanie w mojej sprawie, co nie jest nierozsądne.
Sam Elliott,

1
To był również mój problem - MacOS bez rozróżniania wielkości liter. 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.
orion elenzil

74
git config core.fileMode false

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.


2
Ale co to robi?
Siwel,

1
Chciałbym również wiedzieć, co to robi, ponieważ to również zadziałało dla mnie.
Donato,

2
Kiedy to zrobiłem 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/6207775
Ayushya

1
Link jest uszkodzony ( „Przepraszamy, nie możemy znaleźć twoich jąder” ).
Peter Mortensen

Reszta odpowiedzi nie zadziałała, ale magia!
Spotkaj się z Patelem

53

Zakł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ęcgit 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.

git config core.autocrlf false

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.

echo "* text=auto" >>.gitattributes
rm .git/index     # Remove the index to force Git to
git reset         # re-scan the working directory.
git status        # Show files that will be normalized.
git add -u
git add .gitattributes
git commit -m "Introduce end-of-line normalization"

Jeśli pojawią się pliki, które nie powinny być znormalizowane git status, przed uruchomieniem wyłącz ich atrybut tekstowy git add -u.

manual.pdf      -text

I odwrotnie, w plikach tekstowych, których Git nie wykrywa, można ręcznie włączyć normalizację.

weirdchars.txt  text

8
Nie używam systemu Windows.
Sam Elliott,

1
Domyślnie w systemach innych niż Windows parametr core.autocrlf ma wartość false. Więc nie powinieneś nawet doświadczać tego problemu, jeśli jest on spowodowany przez zakończenia linii. Czy możesz podać więcej szczegółów na temat konkretnej konfiguracji, takich jak to, co git diffpokazuje te pliki, które git statusmówią , że są zmodyfikowane, a także jakiego systemu plików używasz?
Arrowmaster

zaktualizowałem pytanie o odpowiedzi na te pytania. Jeszcze raz przejrzy wszystkie szczegóły w ciągu sekundy lub dwóch. Nie jestem pewien, jakich używają inni członkowie zespołu deweloperów
Sam Elliott

To działało dla nas ( git config core.autocrlf falsebył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.
Dirk

37

Uruchom następujące polecenia. To może rozwiązać problem.

# Remove everything from the index.
git rm --cached -r .

# Write both the index and working directory from git's database.
git reset --hard

Żadne z pozostałych rozwiązań nie działało dla mnie, ale to pozwoliło mi wrócić do działania.
rainabba

1
Próbowałem tego i zadziałało dla mnie. Dziękuję panu LIamie!
Danniel Little

To pogarsza moje repozytorium. W oddziale, który nie miał żadnych zmian, miałem 277 po uruchomieniu. Miałem te same zmiany w innych gałęziach, do których również się przestawiłem. Biegaj ostrożnie. Właśnie przeklonowałem repo i zmodyfikowałem 615 plików. :(
Programista Paul

działało to dla mnie przy użyciu git v2.7.4 z Ubuntu (WSL), Git dla Windows v2.18.0.windows.1 i posh-git Zawsze miałem autocrlf false, a problem zaczął się w Git dla Windows i posh-git po aktualizacji do 2.18.0 dzisiaj
Jim Frenette

Dziwi mnie, że to działa. Dzięki za pomoc. Dla innych idących tą ścieżką pliki, które pozornie zostały zmodyfikowane, to wszystkie pliki .png i .bmp zarządzane przez git LFS
David Casper

16

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:

* text=auto

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.


1
Dzięki, walczyłem z tym o awarie
Andrew Berry,

To był dokładnie mój problem. Inny programista użył GIT przez VS zamiast CLI i stworzył ten plik .gitattributes.
Josh Maag

12

Problem może również wynikać z różnych uprawnień do plików , tak jak w moim przypadku:

Świeżo sklonowane repozytorium (Windows, Cygwin):

$ git ls-tree HEAD
100755 blob 8099ea496a2c78d71125d79a05855f60ebf07904    testfile
   ↑↑↑

Bare zdalne repozytorium (Linux):

$ git ls-tree HEAD
100644 blob 8099ea496a2c78d71125d79a05855f60ebf07904    testfile
   ↑↑↑

5

Chciałem dodać odpowiedź bardziej ukierunkowaną na „Dlaczego” tak się dzieje, ponieważ już istnieje dobra odpowiedź na to, jak to naprawić.

Tak, .gitattributesma * text=autoustawienie, które powoduje ten problem.

W moim przypadku pliki w gałęzi głównej GitHub miały \r\nkońcówki. Wywołałem ustawienia w repozytorium, aby dokonać odprawy z \nzakoń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\nzakończeniami. Git narzeka, ponieważ widzi wyrejestrowane \r\nzakończenia znajdujące się w repozytorium i ostrzega mnie, że sprawdzi \nustawienia. Dlatego pliki należy „modyfikować”.

Na razie to rozumiem.


3

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.


3

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:

# Remove everything from the index.
git rm --cached -r .

# Write both the index and working directory from git's database.
git reset --hard

Wreszcie zdecydowaliśmy, że każdy programista powinien zmienić konfigurację Git, aby zapobiec powtórzeniu się tego problemu:

# Local Git configuration
git config core.ignorecase = true

lub

# Global Git configuration
git config --global core.ignorecase = true

Byłoby lepiej, jeśli tylko upvoted@ KDS męska odpowiedź !
Elharony,

Wygląda na to, że polecenie wiersza polecenia nie powinno mieć znaku równości ( =), ponieważ znajdzie się w ignorecase = =pliku konfiguracyjnym.
Dmytro

1

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\GitRepozamiast C:\Users Documents\yyy\Desktop\GitRepo.


1

Edytuj plik o nazwie .git/config:

sudo gedit .git/config

Lub:

sudo vim .git/config

Zawartość

[core]
    repositoryformatversion = 0
    filemode = false
    bare = false
    logallrefupdates = true

[remote "origin"]
    url = kharadepramod@bitbucket.org:DigitalPlumbing/unicorn-magento.git
    fetch = +refs/heads/*:refs/remotes/origin/*

[branch "master"]
    remote = origin
    merge = refs/heads/master

[branch "productapproval"]
    remote = origin
    merge = refs/heads/productapproval

Zmień filemode=truena filemode = false.


Jest to równoważne zgit config core.Filemode false
Guillermo Prandi,

1

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.quarantineatrybut 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 binarydo swojego .gitattributes.


0

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.


0

Odkryłem, że Git traktuje moje pliki (w tym przypadku .psd) jako tekst. Ustawienie go na typ binarny w .gitattributes rozwiązało to.

*.psd binary

0

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 ...

git rm -rf the-folder-with-modified-stuff
git ci -m 'WAT'

Bum! Wyczyść repozytorium. Problem rozwiązany. Potem musiałem po prostu zrezygnować z ostatniego zatwierdzenia, kiedy to zrobiłem, rebase -ii wreszcie wszystko znów było czyste. Dziwaczny!


0

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.


1
Byłoby pomocne (i interesujące) wiedzieć, które wersje git nie grały razem dobrze.
jpaugh
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.