2009-03-17 9 views
81

Z powodu zewnętrznych dziwnych ograniczeń nie mogę zmodyfikować pliku .gitignore mojego repozytorium. Czy istnieje sposób na zignorowanie plików i katalogów innych niż modyfikowanie .gitignore? Nawet jeśli jest to globalne rozwiązanie, takie jak globalna konfiguracja, które zostanie zastosowane do wszystkich moich repozytoriów.W jaki sposób Git ignoruje pliki bez użycia .gitignore?

Odpowiedz

121

Nie zapomnij, według gitignore, że istnieje porządek pierwszeństwa w różnych „ignoruj ​​źródeł wzorcem”, że Git rozważyć:

  • Patterns odczytać z wiersza polecenia dla tych poleceń, które je obsługują.
  • Wzorce odczytywane z pliku .gitignore w tym samym katalogu, co ścieżka lub w dowolnym katalogu nadrzędnym, z wzorami w plikach wyższego poziomu (do katalogu głównego) nadpisanymi przez pliki niższego poziomu aż do katalogu zawierającego plik.
  • Wzory z $GIT_DIR/info/exclude.
  • Wzory odczytywane z pliku określonego przez zmienną konfiguracyjną core.excludesfile.

Dwa ostatnie może być rozwiązaniem dla problemu, ale:

  • oni nie są replikowane do odległego repozytorium
  • oni mogą mieć swoje wzorce zastąpione przez inne źródła

(Zobacz także ten SO question)


Pozostałe dwa rozwiązania obejmują aktualizację indeksu (git update-index):

Jednak, gdy ty kasa inny oddział lub gdy git pull, że „ignoruj” status może zostać zresetowane. Stąd druga opcja:

Różnica pomiędzy nimi jest to opisane w "Git - Difference Between 'assume-unchanged' and 'skip-worktree'".

+0

Możesz użyć' update-index --assume-unchanged' @ see http://stackoverflow.com/a/25253144/292408 –

+1

@ ElijahLynn pewny. Masz również 'update-index --skip-work-tree'. Ja jave zredagowałem odpowiedź, aby dodać kilka linków do moich starych odpowiedzi ilustrujących te dwa polecenia 'update-index'. – VonC

+0

Słodki, --skip-work-tree jest bardzo przydatny, dzięki! –

90

Jeśli możesz zmodyfikować .git/info/exclude, możesz umieścić tam te same reguły. Ale ten plik znajduje się tylko w lokalnym repozytorium.

+0

Brzmi to jak to jest chyba najlepiej; pozwól, że wykluczysz pliki z lokalnego repozytorium. – Abizern

+1

Jak to działa w przypadku submodułów? Nie ma katalogu '.git' w module podległym ... – zakdances

+3

@twoja frekwencja folderu' .git' modułu podrzędnego jest aktualnie w 'parent_repo/.git/modules/submodule_name'. Więc możesz edytować 'parent_repo/.git/modules/submodule_name/info/exclude' –

17

Istnieją trzy sposoby, aby powiedzieć GIT który plików ignorować:

  • pliki .gitignore
  • $ GIT_DIR/.git/info/wyłączyć
  • Pliki wskazywanego przez core.excludesfile zachodzącego

Dwa ostatnie punkty mogą rozwiązać problem.

Aby uzyskać więcej informacji, zobacz gitignore(5).

0

ignorowanie lokalnych zmian śledzonych plików: git update-index --assume-unchanged my-file.php

nieignorowanie lokalne zmiany w plikach śledzone: git update-index --no-assume-unchanged my-file.php

źródło: git help update-index

--[no-]assume-unchanged 
      ... 
      This option can be also used as a coarse file-level mechanism to ignore uncommitted changes in tracked 
      files (akin to what .gitignore does for untracked files). Git will fail (gracefully) in case it needs to 
      modify this file in the index e.g. when merging in a commit; thus, in case the assumed-untracked file is 
      changed upstream, you will need to handle the situation manually. 
1

Jeśli chcesz po prostu mieć kilka lokalnych plików repozytorium i lokalizacja podkatalogu jest elastyczna, możesz umieścić swoje pliki w tracked_dir1/tracked_dir2/untracked_dir/, a następnie dodać tracked_dir1/tracked_dir2/untracked_dir/.gitignore z treścią jak:

*

Tj

$ cat > tracked_dir1/tracked_dir2/untracked_dir/.gitignore 
* 
<Ctrl+D>