git update-index --assume-unchanged zwraca „fatal, nie można oznaczyć pliku”

136

Mam ten sam problem co OP w tym poście, ale nie rozumiem odpowiedzi oznaczonej jako poprawna (nie widzę, żeby wyjaśniała, jak naprawić sytuację)

Robię to i otrzymuję ten błąd:

$ git update-index --assume-unchanged web.config
fatal: Unable to mark file web.config
  1. Plik JEST dodany do repozytorium

  2. NIE jest w .git/info/exclude

  3. NIE jest w .gitignore(było, ale wyjąłem go, a następnie wymusiłem dodanie pliku web.config za pomocą git add -f web.config, zatwierdzenie i przekazanie tych zmian do repozytorium)

  4. Kiedy robię Git ls-files -o tego NIE ma

Więc co mogę zrobić, aby to naprawić?

Karen
źródło
1
ponownie przeczytaj zaakceptowaną odpowiedź w przywoływanym pytaniu: NIE pojawi się ona w wynikach git ls-files -o. Jeśli tak, nie ma go w repozytorium.
eckes
moja literówka, NIE ma jej na liście, a na pewno jest w repozytorium
Karen

Odpowiedzi:

110

Miałem ten sam problem co Ty i wykonałem te same cztery kroki, które wskazałeś powyżej, i miałem te same wyniki. Obejmuje to fakt, że mój plik był wyświetlany podczas wykonywania git ls-files -o. Jednak w moim przypadku próbowałem wykonać git update-index --assume-unchangedrównież na pliku, którego nie było na liście podczas wykonywania ls-files -o, i nadal otrzymywałem ten sam błąd „ fatal: Unable to mark file”.

Pomyślałem, że może to błąd i pobrałem najnowszą wersję gita, ale to nie pomogło.

W końcu zdałem sobie sprawę, że w tym poleceniu rozróżniana jest wielkość liter! Obejmuje to pełną ścieżkę i nazwę pliku. Po zaktualizowaniu ścieżki do katalogu tak, aby podana była pełna ścieżka z odpowiednią wielkością liter, polecenie wykonało się poprawnie.

Zwróć uwagę, że dotyczyło to Git dla systemu Windows, więc wyniki mogą się różnić w przypadku innych platform.

David Marchelya
źródło
4
Bardzo dziękuję! To zadziałało! Myślę, że wcześniej używałem wszystkich małych liter lub cd do folderu, a następnie próbowałem użyć tego polecenia.
Karen
Jeśli plik się zmieni, to jest to nieprawidłowe. Polecenie to obietnica użytkownika złożona Gitowi, że nie musi tracić cykli na określanie pliku, aby wykryć, czy się zmienił (w przypadku wolnych systemów plików ;-). W końcu jedno z poleceń Gita to zauważy i będziesz zaskoczony. Dokumentacja jest aktualizowana, aby to wyjaśnić.
Philip Oakley,
1
Dzięki, to pośrednio pomogło mi odkryć zły skrypt powłoki w projekcie. Jeśli ścieżka nie istnieje, to się nie powiedzie! :)
uchuugaka
Należy również pamiętać, że to polecenie nie będzie działać dla plików bez wersji. Jeśli masz plik, którego nie ma w repozytorium, można go zignorować w .gitignore, i chłopcze, czy czuję się głupio, pisząc to, ale myślę, że może to pomóc komuś takiemu jak ja. :)
Jesse Ivy,
Aby wyjaśnić, do czego sugerowały niektóre komentarze, jeśli używasz powłoki systemu Windows, która pozwoliła ci uniknąć niedopasowania wielkości liter na płytach CD, pojawi się ten błąd. Albo podaj gitowi pełną ścieżkę do pliku (z poprawną wielkością liter), albo cd z powrotem w górę i ponownie w dół (ponownie, z poprawnymi wielkościami na każdym etapie).
dlf
53

Miałem ten sam problem na komputerze Mac. Rozróżnianie wielkości liter nie stanowiło dla mnie problemu - problem polegał na tym, że musiałem najpierw zresetować git:

Problem:

 git update-index --assume-unchanged index.php
 fatal: Unable to mark file index.php

Rozwiązanie:

git reset HEAD
Unstaged changes after reset:
M   index.php
git update-index --assume-unchanged index.php
Toby Beresford
źródło
2
Mam ten sam problem na komputerze Mac i żadne z sugerowanych rozwiązań nie zadziałało. Dowolny pomysł? Próbuję zatrzymać tymczasowo śledzenie katalogu tylko na moim komputerze, nazwa katalogu to intellij_idea_project_files /. Najwyraźniej wszystkie pliki w tym katalogu zostały odpowiednio oznaczone, z wyjątkiem jednego, a mianowicie my_project_name.iml.
Javad Sadeqzadeh
1
miał ten sam problem i to jest rozwiązanie, które zadziałało dla mnie, a nie to, które dotyczy rozróżniania wielkości liter
CesarPim
Jestem też na Macu i dla mnie "rozwiązaniem" było usunięcie pliku. (Opublikowałbym to jako odpowiedź, ale nie jestem pewien, co się stało, może później.) Stało się coś dziwnego. Git mówił, że plik został zmieniony (chciałem --skip-worktree). Pozbyłem się lokalnych zmian, uruchamiając, git restore .ale pomiń nadal dawał błąd. Wreszcie próbowałem usunąć plik. Szokująco, dupek nie powiedział, że nastąpiła zmiana. Więc najwyraźniej coś dziwnego wydarzyło się, odkąd git zdecydowanie to śledził i zdecydowanie to usunąłem i na pewno nie powiedziałem, że to zmiana.
Kapitan Man
25

W moim przypadku drzewo, które zaznaczałem, było katalogiem, a nie plikiem, jak w twoim przypadku, i brakowało mi ukośnika po jego nazwie.

Niepoprawnie -

git update-index --assume-unchanged directory-name

Prawidłowo -

git update-index --assume-unchanged directory-name/

Zwróć uwagę na ukośnik (/) na końcu.

Sahil Singh
źródło
1
Dzięki, ale kiedy to robię, otrzymuję komunikat „Ignorowanie ścieżki nazwa-katalogu /”
damian
@damian Określ pełną ścieżkę pliku zamiast katalogu nadrzędnego.
Nahid
Jeśli to zrobię, dostanę to, co robi Damian. Z wyjątkiem tego, że mój plik jest plikiem, a nie folderem.
Unknow0059
6

fatal: nie można oznaczyć lokalizacji pliku / el-GR.js

Co możesz zrobić to:

  1. Przejdź do właściwej ścieżki, w której znajduje się plik w Twoim lokalnym (w GITBASH)
  2. Zaktualizuj indeks $git update-index --assume-unchanged <file name>

To mi pomogło! :)

Grace Aloysius
źródło
2
$ git update-index --assume-unchanged ./.idea/vcs.xml fatal: Unable to mark file .idea/vcs.xml $ cd .idea git update-index --assume-unchanged .Pracowałem, dzięki!
AVProgrammer
5

Upewnij się, że plik został dodany do repozytorium git, jeśli nie, dodaj plik w repozytorium git i spróbuj to zadziała.

bisw
źródło
4

Jeśli twoja ścieżka zawiera spacje, możesz otrzymać ten błąd, nawet jeśli masz poprawną wielkość liter.

Powoduje to błąd „krytyczny”:

git update-index --assume-unchanged code/Solution Files/WebEssentials-Settings-json

Aby to naprawić, po prostu dodaj cudzysłowy wokół ścieżki.

git update-index --assume-unchanged "code/Solution Files/WebEssentials-Settings-json"
Jon Crowell
źródło
W moim przypadku miałem / do tyłu.
Erik Bergstedt
4

Mój problem polegał na tym, że wypróbowałem polecenie z symbolem wieloznacznym *, zakładając, że będzie rekurencyjne, ale tak nie było.

Więc co zrobiłem

$ git reset HEAD
Unstaged changes after reset: 
M   .gradle/1.9/taskArtifacts/cache.properties.lock
M   .gradle/1.9/taskArtifacts/fileHashes.bin
M   .gradle/1.9/taskArtifacts/fileSnapshots.bin
M   .gradle/1.9/taskArtifacts/outputFileStates.bin
M   .gradle/1.9/taskArtifacts/taskArtifacts.bin

wykonanie

$ git update-index --assume-unchanged .gradle/1.9/taskArtifacts/*

pracował wtedy dla mnie i nie spowodował PO i mojego problemu.

metodyczne
źródło
4

Miałem ten problem, gdy próbowałem odblokować pliki * .orig.

Oto, co zrobiłem, aby je wyśledzić:

$git reset -- *.orig

jeśli to nie zadziała:

$git clean -fd
EdC
źródło
6
Niebezpiecznie jest prosić ludzi o wykonanie polecenia bez informowania ich, że to polecenie usunie pliki. $ git clean -fd
HS Rathore
3

--assume-unchangeddotyczy wolnych systemów plików, a użytkownicy obiecują, że Git nie musi sprawdzać tego pliku, ponieważ Git może założyć, że jest on niezmieniony. Ale niektóre polecenia nadal sprawdzają i produkują „niespodziankę”!

Nie używaj do plików, które się zmieniają.

Przepraszam, że jestem zwiastunem tej wiadomości (mam aktualizację w celu zmiany tej dokumentacji).

Philip Oakley
źródło
2
Jak więc należy zaktualizować plik, aby oznaczyć go jako „nie śledź mnie”?
javadba
@javadba patrz stackoverflow.com/a/6964492/717355 'git rm --cached filename'
Philip Oakley
thx - głosowano za tym: faktycznie użyłem go zaraz po wysłaniu tutaj. Pracuje.
javadba
uwaga, git rm --cached filenameto usunie plik, gdy inni ściągną
Ryan Taylor
@RyanTaylor tak, ważne jest, aby użytkownicy zdali sobie sprawę z tego, co mówi ich polecenie, czyli „przestań to śledzić, usuń to z moich wersji”. Przeczytaj o najnowszym widoku opiekuna i mojej nowej łatce
Philip Oakley
3

W moim przypadku próbowałem użyć dowolnej z powyższych metod, ale bez powodzenia.

Po wielu próbach po prostu pomyślałem, aby dodać plik do indeksowania.

git add myfile.php

Git odrzucił tę czynność, ale poradził mi, abym zrobił to na siłę.

git add myfile.php -f

I to zadziałało dla mnie.

Stepanov Max
źródło
2

Upewnij się, że masz zaznaczony plik „web.config”.

Jeśli tak nie jest, zostanie wyświetlony ten komunikat o błędzie.

OneSolitaryNoob
źródło
1

Może komuś się przyda. Miałem ten sam problem i nie było problemu ze składnią, bez nazwy ze spacjami, bez problemu ze ścieżką, a polecenie resetowania git nie działało. Przekazywałem polecenie z folderu wewnątrz apache www i usługa apache została zatrzymana. Uruchomiono ponownie usługę apache i błąd zniknął

hernancortes
źródło
1

Jednym z częstych błędów związanych z używaniem tego polecenia jest próba założenia, że ​​plik nie jest śledzony lub plik został już zignorowany przez git.

Upewnij się najpierw, że plik jest śledzony przez uruchomienie

git ls-files | grep relative_path/to/file

Jeśli nie wyświetla pliku, musisz go najpierw dodać:

git add relative_path/to/file

Jeśli to pokazuje twój plik lub już dodałeś ten plik do git, powinieneś być w stanie uruchomić git, zakładając polecenia normalnie:

git update-index --skip-worktree relative_path/to/file

lub dla folderów

git update-index --skip-worktree relative_path/to/folder/

możesz sprawdzić, czy zakłada się, że Twój plik jest ignorowany, uruchamiając

git ls-files -v | grep ^S

Znak S oznacza pominięte pliki.

Ahmed Amr
źródło
0

Dla wszystkich przyszłych gości. Żadne z powyższych nie rozwiązało mojego problemu. Zrozumiałem, że .gitignoreplik musi być umieszczony we właściwym katalogu. W moim przypadku, gdy przeniosłem się .gitignoredo katalogu głównego aplikacji, problem został rozwiązany.

Amir
źródło
0

Sprawdź, czy plik, który ma być oznaczony, istnieje i czy pisze poprawnie, zwłaszcza ścieżkę do pliku i separator pliku. Separatory plików systemu Windows i systemu Linux są w różnych kierunkach.

chengwengao
źródło
1
Chociaż nie jest błędna, ta odpowiedź tak naprawdę niczego nie dodaje do pytania. Wszystkie Twoje sugestie zostały już uwzględnione w istniejących odpowiedziach.
Matt,
0

Zauważyłem, że czasami to nie działa, ponieważ już zapisałeś plik do swojego .gitignore i wykonałeś push lub pull. Musisz tylko wykonać push, a plik powinien być ignorowany przy kolejnych zatwierdzeniach, nawet jeśli lokalnie modyfikujesz plik.

Akah
źródło
0

Miałem ten sam problem z cygwinem w oknach. Podanie pełnej ścieżki do pliku

Sudeep
źródło