„Git“ kaltina „Windows“ už ataskaitas „mirtinas: nėra tokio būdo <kelias> HEAD“

Kai paleisiu git kaltinimą aplanke e, g,:

git blame Foo/FileA.txt

jis grįžta

fatal: no such path 'Foo/FileA.txt' in HEAD

Aš aiškiai matau, kad šis failas yra failų sistemoje, o kiti to paties aplanko failai gali būti sėkmingai kaltinami - taip atsitinka?

Aš siunčiu šį klausimą ir atsakau, nes šiandien aš buvau aklavietėje, ir aš negalėjau rasti vieno atsakymo, kuris atitiktų visą sprendimą.

9
07 февр. nustatė James World 07 Feb 2017-02-07 00:40 '17 - 0:40 2017-02-07 00:40
šaltinis
@ 2 atsakymai

Taip yra dėl to, kad failų sistemoje pirminis aplankas pervadintas nauju pavadinimu, kuris pasikeičia tik priklausomai nuo atvejo, o kai kurie failai buvo pridėti prie įsipareigojimo, kuris įvyko prieš pervadinant aplanką. Čia pateikiamas Powershell užuominos pavyzdys:

 mkdir C:\RenameProblem cd C:\RenameProblem git init mkdir foo "FileA" > foo/FileA.txt git add foo/FileA.txt git commit -m "Add FileA" 

Tada programoje „Windows Explorer“ pervadinkite katalogą „foo“ į „Foo“ ir toliau eikite į „Powershell“ su:

 "FileB" > Foo/FileB.txt git add Foo/FileB.txt git commit -m "Add FileB" 

Šiuo metu git blame /Foo/FileA.txt (kuris baigiasi, kai po pavadinimo pervadinamas skirtukas) baigsis kelio klaida, o git blame /Foo/FileB.txt arba netgi git blame /Foo/FileA.txt bus sėkminga.

Be to, skambinant į git ls-files Foo bus rodomas tik FileB.txt , o git ls-files Foo rodys tik FileA.txt . Ne puiki vieta >

Mano atveju turėjau daug failų, suskirstytų į dvi aplanko pavadinimo versijas.

Šią problemą galite išspręsti pervadindami failą su git mv :

 git mv foo/FileA.txt Foo/FileA.txt git commit -am "Rename foo to Foo" 

Jei reikia pervardyti daug failų, naudokite „Powershell“ bitą (taip pat atkreipkite dėmesį, kad „ git mv turi „ -n jungiklį, jei norite paleisti, jei tai yra sausas, kad galėtumėte patikrinti, ar pavadinimas yra teisingas):

 git ls-files foo | % { ( git mv $_ $('F' + $_.Substring(1))) } 

Anksčiau pateiktame pavyzdyje naudojami git ls-files skirti failų įtraukimui į problemos aplanką foo, o tai reiškia, kad tai yra „ForEach“ ( % yra nuoroda į šią problemą), o po to paleis git mv kiekvienam failui, pateikiančiam pradinį pavadinimą ( $_ ) ir naujas pavadinimas „F“ ir likęs failo pavadinimas ( 'F' + $_.Substring(1)) )

12
07 февр. Atsakymą pateikė James World 07 Feb. 2017-02-07 00:40 '17 - 0:40 2017-02-07 00:40
šaltinis

Kita galimybė yra tai, kad failas arba turintis katalogas yra simbolinė nuoroda. Galite naudoti „ ls -l kad įsitikintumėte, jog taip yra. Pabandykite kaltinti failą dėl pradinės vietos.

0
22 окт. Michael Litvin atsakymas spalio 22 d 2018-10-22 15:02 '18, 15:02 2018-10-22 15:02
šaltinis

Žr. Kitus klausimus apie „ žymes arba užduokite klausimą