Jak zmusić git do wyewidencjonowania gałęzi głównej i usunięcia powrotu karetki po znormalizowaniu plików przy użyciu atrybutu „tekst”?


104

OK, więc dodałem plik .gitattributesz takimi liniami

*.css text
*.js text
etc...

Następnie postępowałem zgodnie z instrukcjami podanymi na http://git-scm.com/docs/gitattributes#_checking-out_and_checking-in

$ 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"

Ale teraz moja kopia robocza wciąż powraca! Mam nieśledzone pliki, które chciałbym zachować. Jak sprawić, by git checkout ponownie master branch ze znormalizowanymi plikami?

Wiem, że pliki są znormalizowane w repozytorium, ponieważ kiedy klonuję repozytorium, mam wszystkie pliki bez powrotu karetki.

Odpowiedzi:


267

Ach! Sprawdź poprzednie zatwierdzenie, a następnie wyewidencjonuj wzorzec.

git checkout HEAD^
git checkout -f master

5
Dzięki za to obejście, ale rażącym problemem w git jest to, że „checkout -f” tak naprawdę nie wymusza ponownego pobrania. Innym obejściem byłoby usunięcie najpierw wszystkich plików kopii roboczych (tj. Wszystkiego oprócz katalogu .git).
pfalcon

Ach tak, dzięki za to! Słysząc to, domyślam się, że moglibyśmy po prostu usunąć interesujące nas pliki i uruchomić wypisanie. Dla mnie był właściwie tylko jeden plik, który próbowałem poprawić. Ale oczywiście mogą to być wszystkie pliki, setki lub tysiące.
Jason

To kończy się niepowodzeniem na git 1.8.3 (mac) z: error: pathspec 'HEAD ^' nie pasuje do żadnego pliku (ów) znanych gitowi.
dval

@dval, spójrz na zmiany w tym poście, a zobaczysz alternatywny sposób, aby to zrobić. Używam też komputera Mac i to zadziałało. Zachęcam również do uaktualnienia swojego git do 2+ i możesz użyć Homebrew, aby zrobić to w bezpieczny sposób.
Jason,

2
To naprawdę nie działa. GIT zaktualizuje tylko te pliki, które zmieniły się między dwoma zatwierdzeniami (z pewnymi wyjątkami). Jeśli repozytorium jest zupełnie nowe, np. tylko dwa zatwierdzenia, a pierwszy jest pusty, to rozwiązanie zadziała. W przeciwnym razie musisz wymusić usunięcie wszystkich plików zgodnie z opisem w odpowiedzi mechsina.
jstine

16

Jak zauważyli inni, można po prostu usunąć wszystkie pliki w repozytorium, a następnie je sprawdzić. Wolę tę metodę i można to zrobić za pomocą poniższego kodu

git ls-files -z | xargs -0 rm
git checkout -- .

lub w jednej linii

git ls-files -z | xargs -0 rm ; git checkout -- .

Używam go cały czas i nie znalazłem jeszcze żadnych wad!

Z jakiegoś innego oświadczenia, -zdołącza znak null na końcu każdego wpisu przez wyjście ls-files, a -0mówi xargsdo oddzielania wyjście było odbieranie przez tych znaków null.

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.