git 1.7.12
Chcę oznaczyć wszystkie pliki poniżej danego katalogu jako zakładane-niezmienione.
1) git update-index --assume-unchaged dir/
daje „Ignorowanie ścieżki”.
2) git update-index --assume-unchaged dir/*
szybko zawiedzie, ponieważ napotka pliki, które nie są śledzone, dlatego wyświetla komunikat „fatal: Unable to mark file” i kończy pracę.
3) Spróbuj wygenerować listę plików do oznaczenia. cd
do żądanego katalogu, a następnie uruchom git ls-files | tr '\n' ' ' | git update-index --assume-unchanged
. Nie powoduje to żadnego komunikatu o błędzie, ale nie oznacza pomyślnego oznaczenia plików. Pierwsza część polecenia git ls-files | tr '\n' ' '
poprawnie tworzy rozdzieloną spacjami listę wszystkich plików, które chcę zaznaczyć. Jeśli skopiuję i wkleję dane wyjściowe tego polecenia do wiersza poleceń, git update-index
polecenie działa. Co nie działa z rurami?
Nie, nie wystarczy mi dodać dir
do .gitignore. Potrzebuję tych plików w repozytorium, ale niepożądane zmiany zostaną wprowadzone lokalnie, które należy zignorować, aby użytkownicy mogli wykonywać ściąganie.
źródło
git ls-files -z
git ls-files -z | xargs -0 git update-index --no-assume-unchanged
, pomyślałbym ...git ls-files -z | git update-index -z --stdin
jest czystszy.find
Komenda z GNU Findutils posiada-exec
opcję, która usuwa większość kłopotów z użyciemxargs
, choć jego składnia jest trochę wyjątkowy. Jednak doskonale radzi sobie z nazwami plików ze spacjami.To polecenie spowoduje, że git założy, że wszystkie pliki w wymienionym katalogu i pod nim są niezmienione:
Find pobiera każdy argument po
-exec
do;
(przed którym musisz uciec, aby powłoka go nie zjadł) i uruchamia go raz dla każdego znalezionego pliku, zastępując{}
(ponownie pojedynczy cudzysłów, aby powłoka go nie zjadła) nazwą znalezionego pliku.Używając
find
kryteriów dopasowania (maksymalna głębokość rekurencji, czy dopasowanie jest plikiem, czy katalogiem, czy nazwa pliku pasuje do wyrażenia)-exec
, możesz zrobić wiele potężnych rzeczy.Nie jestem pewien co do innych implementacji
find
polecenia. YMMV.źródło
-exec
jest opcją standardową . Możesz również-exec git update-index --assume-unchanged {} +
(również zdefiniowany przez standard), który przekazuje wiele nazw plików do polecenia na raz, zmniejszając liczbę wywołań polecenia git.Dodaj nazwę katalogu do
.git/info/exclude
. Działa to w przypadku nieśledzonych plików.źródło
Yeap,
działa tylko z plikami, a nie z katalogami. Myślę, że jeden z szybszych sposobów:
źródło
cd
, można przekazać dir jako ostatecznego argumentu:git ls-files -- $DIR | xargs -l git update-index --assume-unchanged -- $DIR
.