Mam repozytorium zawierające dwa pliki, które podobno zmieniłem lokalnie.
Więc utknąłem z tym:
$ git status
# On branch master
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: dir1/foo.aspx
# modified: dir2/foo.aspx
#
no changes added to commit (use "git add" and/or "git commit -a")
Doing git diff
mówi, że zmieniła się cała zawartość pliku, mimo że patrząc na to, wydaje się to nieprawdą (wydaje się, że istnieją wspólne zakresy linii, których diff wydaje się nie widzieć).
Co ciekawe, nie pamiętam, żebym zmieniał te pliki lokalnie. To repozytorium jest używane z jednym zdalnym repozytorium (prywatnym, na GitHub.com, FWIW).
Bez względu na to, co próbowałem, nie mogę odrzucić tych lokalnych zmian. Wypróbowałem wszystkie:
$ git checkout -- .
$ git checkout -f
$ git checkout -- dir1/checkout_receipt.aspx
$ git reset --hard HEAD
$ git stash save --keep-index && git stash drop
$ git checkout-index -a -f
Innymi słowy, wypróbowałem wszystko, co opisano w sekcji Jak odrzucić zmiany niestacjonarne w Git? plus więcej. Ale te 2 pliki pozostają zablokowane jako „zmienione, ale niezatwierdzone”.
Co do cholery spowodowałoby, że dwa pliki utknęłyby w ten sposób i pozornie „cofnęły-tabelę”?
PS Na powyższej liście pokazującej polecenia, które już wypróbowałem, omyłkowo napisałem, git revert
kiedy miałem na myśli git checkout
. Przepraszam i dziękuję tym z Was, którzy odpowiedzieli, że powinienem spróbować checkout
. Zredagowałem pytanie, aby je poprawić. Zdecydowanie już próbowałem checkout
.
git diff --ignore-space-change
lubgit diff --ignore-all-space
dokonać zmian w wyjściugit diff
?git diff
że pliki są identyczne.git config --global core.autocrlf false
zamiast „prawda”.Odpowiedzi:
Jakie są zakończenia linii w plikach? Założę się, że to CRLF. Jeśli tak, zajrzyj do tego przewodnika: http://help.github.com/line-endings/
Krótko mówiąc, musisz upewnić się, że git jest ustawiony tak, aby konwertować zakończenia linii na LF przy zatwierdzaniu, a następnie zatwierdzać te pliki. Pliki w repozytorium powinny zawsze mieć format LF, pliki wypisane powinny być natywne dla systemu operacyjnego, zakładając, że ustawiłeś poprawnie git.
źródło
git config --global core.autocrlf true
podobnie jak druga strona pchająca do repozytorium na GitHubie.<pre>
bloku tego przewodnika, aby naprawić pliki w repozytorium.Spędziłem godziny próbując rozwiązać podobny problem - zdalną gałąź, którą sprawdziłem, która uparcie pokazywała cztery pliki jako „Zmienione, ale nie zaktualizowane”, nawet po usunięciu wszystkich plików i
git checkout -f
ponownym uruchomieniu (lub innych odmianach z tego postu)!Te cztery pliki były potrzebne, ale z pewnością nie zostały przeze mnie zmodyfikowane. Moje ostateczne rozwiązanie - przekonaj Gita, że nie zostały zmienione. Poniższe działa dla wszystkich wyewidencjonowanych plików, pokazując status 'zmodyfikowany' - upewnij się, że zatwierdziłeś / ukryłeś te, które naprawdę zostały zmodyfikowane !:
Jednak na Mac OSX xargs działa trochę inaczej (dzięki Daniel za komentarz):
Dodałem to jako miejsce zastępcze dla siebie na następny raz, ale mam nadzieję, że pomoże to również komuś innemu.
-Glin
źródło
git ls-files -m | xargs -I {} git update-index --assume-unchanged {}
git ls-files -v|grep '^h' | cut -c3- | xargs -i git update-index --no-assume-unchanged "{}"
assume-unchaged
, jak w przypadku @ RodH257. Uważam, że najbardziej poprawne odpowiedzi dla przypadku, gdy polecenia podobagit checkout -- file
,git stash
agit reset --hard HEAD
nie praca, jak już odpowiedział edycji.gitattributes
tak naprawiłem ten sam problem w moim przypadku: otwórz .gitattributes change:
do:
zapisz i zamknij, a następnie przywróć lub zresetuj, dzięki @Simon East za podpowiedź
źródło
text=auto
ustawienia w .gitattributes działało u mnie, a potem pogit reset --hard
przywróceniu tego ustawienia pliki nie były już wyświetlane jako zmodyfikowane!text=auto
ustawieniem. Pracuję w repozytoriach z zatwierdzeniami z wielu systemów operacyjnych i nadal nie wiem, co powoduje więcej problemów: zachować je lub porzucić.Inną możliwością jest to, że różnica (która uniemożliwia przywrócenie tych plików za pomocą polecenia wypisania) dotyczy trybu pliku. To właśnie mi się przytrafiło. W mojej wersji gita możesz to odkryć za pomocą
I pokaże ci zmiany trybu plików. Jednak nadal nie pozwala ci ich cofnąć. Do tego użyj też
lub zmień git .config w edytorze tekstu, dodając
Po wykonaniu tej czynności możesz użyć
a plik powinien zniknąć.
(Wszystko to otrzymałem z odpowiedzi na pytanie Jak wprowadzić zmiany trybu ignorowania git (chmod)? )
źródło
core.filemode
było już ustawione na fałsz). W moim przypadku poprawką / obejściem była odpowiedź Alana Forsytha .Spróbuj cofnąć zmiany lokalne :
źródło
checkout
. Już próbowałemcheckout
. Mimo wszystko dziękuję za odpowiedź. To była dobra odpowiedź na moje pierwotne pytanie, więc zagłosuję za.Miałem kilka plików zmienionych fantomowo, które były wyświetlane jako zmodyfikowane, ale w rzeczywistości były identyczne.
Uruchomienie tego polecenia czasami działa:
(wyłącza "inteligentne", ale często nieprzydatne konwersje kończące wiersz gita)
Ale w innym przypadku stwierdziłem, że było to spowodowane
.gitattributes
plikiem w katalogu głównym, który miał pewne ustawienia końca linii, które próbowały zastosowaćautocrlf
do niektórych plików, nawet gdy był wyłączony. W rzeczywistości nie było to pomocne, więc usunąłem.gitattributes
, zatwierdziłem i plik nie był już wyświetlany jako zmodyfikowany.źródło
text=auto
ustawienia w .gitattributes działało u mnie, a potem pogit reset --hard
przywróceniu tego ustawienia pliki nie były już wyświetlane jako zmodyfikowane!źródło
checkout
. Już próbowałemcheckout
. Mimo wszystko dziękuję za odpowiedź. To była dobra odpowiedź na moje pierwotne pytanie, więc zagłosuję za.Mogłeś również mieć problem związany z nazwami katalogów wielkości liter. Niektórzy z Twoich kolegów mogli zmienić nazwę katalogu z np. MyHandler na MyHandler . Jeśli później wypchnąłbyś i ściągnął niektóre pliki z oryginalnego katalogu, miałbyś 2 oddzielne katalogi w zdalnym repozytorium ORAZ tylko jeden na twoim lokalnym komputerze, ponieważ w Windows możesz mieć tylko jeden. Masz kłopoty.
Aby sprawdzić, czy tak jest, po prostu sprawdź, czy zdalne repozytorium ma podwójną strukturę.
Aby to naprawić, wykonaj kopię zapasową katalogu nadrzędnego poza repozytorium, a następnie usuń katalog nadrzędny i wypchnij go. Wyciągnij (tutaj, kiedy drugi oznaczony jako usunięty powinien pojawić się na statusie) i naciśnij ponownie. Następnie odtwórz całą strukturę z kopii zapasowej i ponownie prześlij zmiany.
źródło
Myślę, że pomocne byłoby podpowiedź, jak odtworzyć problem , aby lepiej zrozumieć problem:
2 sposób, aby odtworzyć: W powyższym skrypcie zastąpić tę linię:
echo "*.txt -text" > .gitattributes
z
git config core.autocrlf=false
i zachować resztę linii jak
Co mówią wszystkie powyższe informacje? Plik tekstowy można (w pewnych okolicznościach) zatwierdzić za pomocą CRLF (np.
-text
W.gitattributes
/ lubcore.autocrlf=false
).Kiedy później będziemy chcieli traktować ten sam plik jako tekst (
-text
->text
), będzie musiał zostać ponownie zatwierdzony .Oczywiście możesz tymczasowo ją cofnąć (zgodnie z poprawną odpowiedzią Abu Assar ). W naszym przypadku:
Odpowiedź brzmi : czy naprawdę chcesz to zrobić, ponieważ spowoduje to ten sam problem za każdym razem, gdy zmienisz plik.
Dla przypomnienia:
Aby sprawdzić, które pliki mogą powodować ten problem w repozytorium, wykonaj następujące polecenie (git powinien być skompilowany z --with-libpcre):
Przekazując plik (i) (zakładając, że chcesz traktować je jako tekst), jest to to samo, co zrobienie tego, co jest proponowane w tym linku http://help.github.com/line-endings/ w celu naprawienia takich problemów . Ale zamiast usuwać
.git/index
i wykonywaćreset
, możesz po prostu zmienić plik (i), następnie wykonać,git checkout -- xyz zyf
a następnie zatwierdzić.źródło
Miałem ten sam problem, z ciekawym dodatkiem, że pliki były zmieniane na oknach, ale nie przy oglądaniu ich z WSL. Żadne zamieszanie z zakończeniami linii, resetami itp. Nie było w stanie tego zmienić.
W końcu znalazłem rozwiązanie w tej odpowiedzi . Poniżej znajduje się tekst do przekonania:
Rozwiązałem ten problem, wykonując następujące czynności
1) Usuń każdy plik z indeksu Gita.
2) Przepisz indeks Git, aby zebrać wszystkie nowe zakończenia linii.
Rozwiązanie było częścią kroków opisanych na stronie git https://help.github.com/articles/dealing-with-line-endings/
źródło
Dla mnie nie chodziło o zakończenia linii. Chodziło o zmianę wielkości liter w nazwie folderu (Reset_password -> Reset_Password). To rozwiązanie pomogło mi: https://stackoverflow.com/a/34919019/1328513
źródło
Ten problem może być również spowodowany tym, że git traktuje różnice w wielkości liter jako różne pliki, ale system Windows traktuje je jako ten sam plik. Jeśli w nazwie pliku zmieniono tylko wielkość liter, to każdy użytkownik systemu Windows tego repozytorium znajdzie się w takiej sytuacji.
Rozwiązaniem jest potwierdzenie, że zawartość plików jest poprawna, a następnie ponowne ich wprowadzenie. Musieliśmy połączyć zawartość obu plików, ponieważ były różne. Następnie pociągnij, a nastąpi konflikt scalania, który możesz rozwiązać, usuwając zduplikowany plik. Ponownie uruchom rozdzielczość scalania i wrócisz do stabilnego stanu.
źródło