Jak tylko zmieniłeś zawartość pliku fałszywego-symlink-a, nie zmieniając również jego trybu z dowiązania symbolicznego do zwykłego i zatwierdziłeś wynik, zrobiłeś blob, którego nie można wyodrębnić w systemie operacyjnym z prawdziwymi dowiązaniami symbolicznymi, ponieważ masz obiekt, który ma być dowiązaniem symbolicznym, ale jego zawartość jest zbyt długa, aby mogła być nazwą ścieżki. Interfejs sieciowy nie robi ci żadnych korzyści, ukrywając ten problem.
Prawdopodobnie będziesz musiał wykonać kopię zapasową tego zatwierdzenia, naprawić i ponownie zatwierdzić wszystko po nim. Pomocne może być git rebase -i
, ale może to nie być łatwe, szczególnie jeśli wprowadzono więcej zmian w plikach, gdy znajdowały się one w tym fałszywym stanie symlink-ale-nie-naprawdę-a-symlink.
Przypuśćmy, że złe jest abcdef123
popełnić, trzeba to zrobić:
git rebase -i 'abcdef123^'
które będzie można umieścić w edytorze z listy zobowiązuje. abcdef123
powinien znajdować się w pierwszym wierszu. W tej linii zmień pick
na edit
. Jeśli jest więcej niż jedno złe zatwierdzenie, zmień je wszystkie na edit
. Zapisz i zamknij edytor.
Teraz wrócisz do punktu, w którym popełniłeś zły plik. To jest Twoja szansa, aby zmienić historię, naprawiając wszystko, co kiedyś poszło nie tak. Sprawdzić commit z
git show
i cofnąć złe część przywracając pierwotną symlink ścieżkę do pliku i git add
ing go. Lub naprawdę możesz naprawdę usunąć link symboliczny z git rm
, a następnie utworzyć nowy plik i git add
, który. Jeśli wybierzesz pierwszą opcję, pamiętaj, że treść dowiązania symbolicznego jest po prostu ścieżką. To nie jest plik tekstowy - na końcu nie ma znaku nowej linii. Jeśli zmienisz go za pomocą edytora tekstu, który doda znak nowej linii, będziesz miał uszkodzone dowiązanie symboliczne (wskazując na plik z nowym znakiem w jego nazwie).
Po wykonaniu swój git add
, włóż stałe popełnić w jego miejsce w historii:
git commit --amend
git rebase --continue
Jeśli zmieniono wiele z pick
zobowiązuje do edit
trzeba będzie powtórzyć tę procedurę dla każdego z nich. Ostateczny git rebase --continue
przywróci cię do teraźniejszości.
Jeśli jesteś w przeszłości zatwierdzenia podczas rebase i odkrywasz, że całe zatwierdzenie jest złe (nie zrobił nic innego oprócz zamiany dowiązania symbolicznego do niezmodyfikowanej zawartości pliku, do którego wskazuje), wtedy możesz git rebase --skip
zamiast zmieniając i kontynuując. Jeśli wiesz z wyprzedzeniem, że tak się stanie, możesz po prostu usunąć złe zatwierdzenie z listy git rebase -i
zamiast zmienić jego pick
na edit
.
Jeśli masz wiele oddziałów, na które wpływ mają złe zatwierdzenia, konieczne będzie powtórzenie całej procedury dla każdego oddziału. Sprawdź oddział, uruchom git rebase -i
do ukończenia (co oznacza, że git rebase --continue
mówi "Zakończono pomyślnie"), a następnie sprawdź kolejną gałąź i zrób to jeszcze raz.
W przyszłości, dzieląc pracę programistyczną między systemem Windows a rzeczywistym systemem operacyjnym, system Windows będzie działał z cygwin. Wewnątrz cygwin, dowiązania symboliczne są dowiązaniami symbolicznymi i nie można ich zepsuć tak jak robiłeś.
Plus 2 jeśli mógłbym – jomofrodo