git update-index --assume-unchanged w katalogu

101

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. cddo żą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-indexpolecenie działa. Co nie działa z rurami?

Nie, nie wystarczy mi dodać dirdo .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.

Xander Dunn
źródło

Odpowiedzi:

174

git update-index chce, aby nazwy plików były podane w wierszu poleceń, a nie na standardowym wejściu.

Krok 1:

cd do folderu, który chcesz założyć, jest niezmieniony

Krok 2:

Możesz to zrobić:

git update-index --assume-unchanged $(git ls-files | tr '\n' ' ')

lub

git ls-files | tr '\n' ' ' | xargs git update-index --assume-unchanged

Chociaż w obu przypadkach nazwy plików ze spacjami będą problematyczne. Jeśli je masz, możesz użyć tego:

git ls-files -z | xargs -0 git update-index --assume-unchanged

Edycja: włączone dane wejściowe od @MatthewScharley dotyczące git ls-files -z.

Polecenia systemu Windows

Uwaga: jeśli korzystasz z systemu Windows, użyj Git Bash, aby uruchomić te polecenia

twalberg
źródło
2
FYI, że `| bit tr '\ n' '' 'jest niepotrzebny.
Václav Slavík
7
@twalberg: Możesz po prostu użyćgit ls-files -z
Matthew Scharley,
2
@twalberg Jak cofnąć to polecenie "git ls-files -z | xargs -0 git update-index --assume-unchanged"
Mohamed Hussain
3
@MohamedHussain git ls-files -z | xargs -0 git update-index --no-assume-unchanged, pomyślałbym ...
twalberg
1
git ls-files -z | git update-index -z --stdinjest czystszy.
Jed
22

findKomenda z GNU Findutils posiada -execopcję, która usuwa większość kłopotów z użyciem xargs, 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 path/to/dir -type f -exec git update-index --assume-unchanged '{}' \;

Find pobiera każdy argument po -execdo ;(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 findkryterió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 findpolecenia. YMMV.

theycallhimart
źródło
2
-execjest 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.
Tom Fenech
16

Dodaj nazwę katalogu do .git/info/exclude. Działa to w przypadku nieśledzonych plików.

Steve Pitchers
źródło
To działa świetnie! Czy wiesz, czy to działa również z plikami?
betomoretti
Ale to nie powoduje wypychania nieśledzonych plików na github! czy jest jakikolwiek sposób, aby po prostu zignorować je w rejestrach, ale faktycznie przechowywać je w repozytoriach !?
Mahmoud Zalt
2

Yeap,

git update-index --assume-unchanged

działa tylko z plikami, a nie z katalogami. Myślę, że jeden z szybszych sposobów:

cd dir
ls | xargs -l git update-index --assume-unchanged
Victor Perov
źródło
2
Zamiast używać cd, można przekazać dir jako ostatecznego argumentu: git ls-files -- $DIR | xargs -l git update-index --assume-unchanged -- $DIR.
kzh