2012-01-12 11 views
5

Używam Git samodzielnie dla mojego lokalnego oprogramowania w Visual Studio 2010. Niedawno utworzyłem nowy oddział, aby dokonać większego refaktoryzacji jednego z okien dialogowych . Zrobiłem następującymi zmianami:Nierozwiązywalny błąd Gita: Poniższe pliki drzewa, które nie zostały naprawione, zostałyby zastąpione przez pobranie płatności.

  • Zmień nazwę Form1 do Form1a (w tym wszystkie pliki zależności)
  • Dodaj nowy Form1

Sprawdziłem tę zmianę do gałęzi, powiedzmy form-refaktoryzacji. Co ciekawe, Git nie zauważył, że zmieniłem nazwę pliku Form1.cs na Form1a.cs i stworzyłem zupełnie nowy, zupełnie inny Form1.cs, ale zamiast tego zauważyłem nowy plik Form1a.cs i odkryłem wiele różnic między poprzednie i nowe pliki Form1.cs. Będzie to oczywiście prowadzić do całkowicie uzbrojonych różnic, ale nie obchodzi mnie w tym przypadku, o ile wszystkie pliki są poprawnie obsługiwane w końcu.

Potem przełączyłem się z powrotem na master, aby wykonać kilka innych drobnych zmian. Nic sprzecznego. Do tej pory wszystko działało dobrze.

Dzisiaj chciałem wrócić do mojej formy - refaktoryzacji, aby kontynuować tę pracę. Ale dostaję tylko następujący komunikat:

git.exe checkout form-refactoring 

Aborting 
error: The following untracked working tree files would be overwritten by checkout: 
Form1.Designer.cs 
Please move or remove them before you can switch branches. 

Co to ma być? Wspomniany plik nie jest nieśledzony. Ani w gałęzi głównej, ani w gałęzi formowania-refaktoryzacji. Jest częścią obu gałęzi, ale jedna nie jest potomkiem drugiej. Co by się stało, gdybym go skasował, czy odszedł na dobre? Nie ufam, że Git przywrócił poprawny plik, jeśli teraz coś usunę. Nie grałem z żadnym plikiem poza wymienionymi wyżej operacjami Git, więc dlaczego miałbym teraz grać z jakimkolwiek plikiem, aby dalej używać operacji Git? Git go zepsuł, Git ma sobie z tym poradzić!

W tej chwili nie mogę kontynuować pracy, ponieważ nie mogę przełączać oddziałów. Czy istnieje proste rozwiązanie tego problemu?

Wersja Git to 1.7.6, TortoiseGit to 1.7.3.

+0

Jeżeli zdarzy się, że wzór, który pasuje Form1.Designer.cs w .gitignore lub inny ignorować konfiguracje? – James

+0

Ten plik ma zielony znacznik wyboru w Eksploratorze i ma również historię. Zakładam więc, że to nie jest ignorowane. Ponadto w moim projekcie są inne pliki Form.Designer.cs, które nie powodują żadnych problemów. I to nie jest pierwsze repozytorium Git, które stworzyłem z VS2010, do dziś działało dobrze nawet kilka starań w rozgałęzieniach. – ygoe

+0

Proszę dokładnie sprawdzić filtry ignorowania, aby sprawdzić, czy zostały zmienione dla tego repozytorium lub oddziału. Nadal możesz zobaczyć status i historię w pliku, jeśli został dodany przed filtrem ignorowania.Wszystko, co używa statusu git, nadal będzie go zgłosić (jak znaczniki eksploratora) Może to spowodować błąd, który wskażesz, jeśli naprawdę nastąpiły zmiany w pliku, ponieważ Git zignoruje to teraz podczas działania statusu Git. Jednak Git nadal będzie wiedział, że zmienił się podczas próby zrealizowania transakcji i podania tego błędu. – James

Odpowiedz

17

Opcja konfiguracji core.ignorecase nie została ustawiona, a Visual Studio zmieniło nazwę pliku .Designer.cs na wypadek, przełączając z kapitału na niższy "D" (lub na odwrót). W końcu to był problem. Usunięcie historii pliku (usunięcie i ponowne dodanie plików) zajęło mi rozwiązanie tego błędu po ustawieniu opcji na true. W rzeczywistości opcja została ustawiona na jednym komputerze, ale podczas klonowania repozytorium ustawienie zostało w jakiś sposób utracone. A potem przeznaczenie tylko czekało, aż VS zmieni nazwę tego pliku, by mnie złapać.

więc na Windows, zawsze trzeba się upewnić, że te dwa ustawienia są prawidłowe, po każdej operacji startowych/Klon:

git config core.ignorecase true 
git config core.autocrlf false 

niektóre narzędzia (TGit, gitscc itd.), Nie wydaje się to zrobić dobrze. Jest to absolutnie konieczne do normalnej pracy w systemie Windows, ale Git nie dba o to, czy nie są ustawione poprawnie i po prostu pozwala ci się potknąć, nie informując cię dlaczego. Jest to tak samo kłamliwe, jak pomocne w tej kwestii.

0

Git nie zezwala na przełączanie gałęzi, jeśli istnieje możliwość utraty danych.

Generalnie dobrze jest zatwierdzić wszystkie zmiany przed przejściem do innej gałęzi. Jeśli jesteś absolutnie pewien, że nie dokonywać tej zmiany, niż można zresetować swoje drzewo jest wykonywana przy użyciu

git reset --hard HEAD 

polecenie. Ale zdecydowanie nie polecam tego robić. Użyj polecenia, aby ukryć zmiany w pamięci wewnętrznej. W takim przypadku zawsze możesz odzyskać swoje dane.

+0

Nie mam żadnych niezamierzonych zmian w tej chwili. Zrobiłem wszystko, zanim przerzuciłem się do głównego oddziału, a teraz wszystko popełniłem, ale nie mogę się nigdzie zmienić. Działanie commit mówi, że nie mam żadnych niezatwierdzonych zmian. Czy twoja odpowiedź nadal obowiązuje? – ygoe

+0

@LonelyPixel Twój komentarz jest mylący. git mówi, że są pewne zmiany. W każdym razie git stash nie robi nic na czystym katalogu roboczym. Więc można bezpiecznie eksperymentować. –

+0

Jak to jest mylące? Stash mówi: Sukces zasobu - Brak lokalnych zmian do zapisania. – ygoe

0

Wygląda na to, że gałąź XXX (form-refaktoryzacja) zawiera ten plik, ale YYY tego nie robi. A teraz próbujesz przejść z oddziału YYY do XXX. Git obawia się, że po prostu zapomnisz dodać plik, więc nie pozwala przejść do innej gałęzi.

Zastosowanie

git status 

celu ustalenia, czy ten plik (Form1.Designer.cs) jest untracked.W takim przypadku po prostu je zatwierdz, a następnie możesz bezpiecznie przenieść się do innego oddziału

+0

Jak skomentowałem na drugą odpowiedź, nie ma żadnych niezatwierdzonych zmian i ten plik nie jest naprawdę nieśledzony. Nie mogę już nic zrobić, żeby uporządkować mój katalog roboczy. – ygoe

+0

git clean -f -d czyści twoje działające drzewo. –

+0

To nie pomaga. – ygoe

0

Po pierwsze, Git nie kłamie. Plik naprawdę jest śledzony w gałęzi i naprawdę istnieje w drzewie pracy, a naprawdę jest nieśledzony.

Biorąc pod uwagę, że sugerujesz w komentarzach gdzie indziej, że plik nie pojawia się w różnicach lub nawet git status, to brzmi jak dodałeś go do swojego gitignore (może przypadkowo przez wzór wieloznaczny). Wiem, że powiedziałeś, że nie, ale jeśli nie pojawi się na wyjściu z pliku git status jako niepotwierdzonego, to jest on nieśledzony i ignorowany. Aby to sprawdzić, można wymienić wszystkie pliki ignorowane przez .gitignore:

git ls-files -i --exclude-from=.gitignore 

Można również wymienić wszystkie pliki nieśledzone ignorowane czy nie:

git clean -xdn 

(Wydaje się, że jesteś bardzo upewnij się, że plik jest śledzony - jeśli tak naprawdę byłby, git show HEAD:path/to/file wyświetliłby zatwierdzoną zawartość pliku. Podejrzewam jednak, że to powie "fatal: ścieżka" ścieżka/do/plik "nie istnieje w" HEAD "" .)

Innym sposobem sprawdzenia, czy plik jest nieśledzony i ignorowany jest po prostu r zamień go, a następnie sprawdź, czy git status zgłasza go jako usunięty; jeśli nie, to nie było śledzone.

Zakładając, że wyświetli się ten plik, powinieneś sprawdzić plik w swoim drzewie pracy. Możesz zobaczyć, jaka wersja pliku jest używana przez drugą gałąź do porównania. Jeśli jesteś zadowolony, że nie potrzebujesz wersji w drzewie pracy, po prostu ją usuń. Jeśli obawiasz się, że możesz go potrzebować, zmień jego nazwę lub przenieś go z katalogu. Jeśli zdasz sobie sprawę, że go potrzebujesz, powinieneś dowiedzieć się, jaki ignorowany wzór go ignoruje, usunąć go, dodać i zatwierdzić. W każdym razie, kiedy już zajmiesz się plikiem, będziesz mógł przełączać gałęzie.

+0

'git ls-files -i --exclude-from = .gitignore' nic nie pokazuje. Używanie prawdziwej względnej ścieżki do .gitignore pokazuje "fatal: can not use .. \. Gitignore jako plik exclude". "git show HEAD: path/to/file" pokazuje oczekiwaną zawartość tego pliku. Tak naprawdę to jest zaznaczone. Zmiana nazwy pliku, "status git" zgłasza skasowany i nowy nieśledzony plik. Git wyświetli mi również ten sam plik z drugiego oddziału, ale ponieważ te pliki są generowane przez projektanta VS, nie mogę ich porównać z moim okiem. - Czy mogę teraz bezpiecznie twierdzić, że Git naprawdę mnie okłamuje? – ygoe

+0

Cóż, to brzmi jak gdyby coś udało się jakoś zsynchronizować lub uszkodzić, jeśli klon repo, z działającym drzewem identycznym z pierwotnym, działa normalnie. Trudno w to uwierzyć, ponieważ jest to dość dobrze przetestowana podstawowa część Gita, ale jeśli masz pewność, że to fałszywy błąd, możesz zgłosić to na listę mailingową Git. – Cascabel

+0

To wciąż jest trochę zepsute. :(Mogę zobowiązać się do mojego nowego repozytorium i przełączyć się z powrotem do głównego oddziału, ale połączenie nie powiedzie się z tego samego powodu.Git wierzy, że jeden z plików, którymi zarządza jest niepotwierdzony i zostanie nadpisany. na listę mailingową, ale nie ma jeszcze odpowiedzi.Ariotowanie repozytorium nie wydaje się być zbyt interesujące – ygoe

0

To rozwiązało problem dla mnie rm .git/fs_cache

Powiązane problemy