Jak sprawić, by Git ignorował pliki bez używania .gitignore?

137

Z powodu zewnętrznych dziwnych ograniczeń nie mogę modyfikować .gitignoremojego repozytorium. Czy istnieje sposób na ignorowanie plików i katalogów inny niż modyfikowanie pliku .gitignore? Nawet jeśli jest to rozwiązanie globalne, takie jak konfiguracja globalna, która zostanie zastosowana do wszystkich moich repozytoriów.

pupeno
źródło

Odpowiedzi:

181

Nie zapominaj, zgodnie z gitignore , że istnieje kolejność pierwszeństwa w różnych „ignorowanych źródłach wzorców”, które rozważa Git:

  • Wzorce odczytywane z wiersza poleceń 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, przy czym wzorce w plikach wyższego poziomu (do katalogu głównego) są zastępowane przez te z plików niższego poziomu, aż do katalogu zawierającego plik.
  • Wzory czytane z $GIT_DIR/info/exclude.
  • Wzorce odczytywane z pliku określonego przez zmienną konfiguracyjną core.excludesfile.

Dwie ostatnie mogą być rozwiązaniem Twojego problemu, ale:

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

(Zobacz także to pytanie SO )


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

Jednak gdy wyewidencjonujesz inną gałąź lub gdy ty git pull, ten status „ignoruj” może zostać zresetowany. Stąd inna opcja:

Różnica między nimi jest wyjaśniona w sekcji „ Git - różnica między ' assume-unchanged' a ' skip-worktree' ”.

VonC
źródło
Możesz użyć update-index --assume-unchanged@see stackoverflow.com/a/25253144/292408
Elijah Lynn
1
@ElijahLynn pewnie. Ty też masz update-index --skip-work-tree. Jave zredagowałem odpowiedź, dodając kilka linków do moich starych odpowiedzi, ilustrujących te dwa update-indexpolecenia.
VonC
145

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

Ólafur Waage
źródło
1
Wygląda na to, że to prawdopodobnie najlepszy wybór; pozwala wykluczyć pliki z lokalnego repozytorium.
Abizern
1
Jak to działa w przypadku modułów podrzędnych? Nie ma .gitkatalogu w
module podrzędnym
10
@yourfriendzak .gitfolder podrzędny znajduje się w rzeczywistości parent_repo/.git/modules/submodule_name. Więc zredagowałbyśparent_repo/.git/modules/submodule_name/info/exclude
Kara Brightwell,
26

Istnieją trzy sposoby na poinformowanie GIT, które pliki mają ignorować:

  • .gitignore akta
  • $GIT_DIR/.git/info/exclude
  • Pliki wskazywane przez core.excludesfileustawienie

Te dwa ostatnie punkty mogą rozwiązać twój problem.

Więcej informacji można znaleźć w gitignore (5) .

Ferdinand Beyer
źródło
6

Ignoruj ​​lokalne zmiany w śledzonych plikach: git update-index --assume-unchanged my-file.php

Nie ignoruj ​​lokalnych zmian w śledzonych plikach: 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.
Elijah Lynn
źródło
5

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

*

To znaczy

$ cat > tracked_dir1/tracked_dir2/untracked_dir/.gitignore
*
<Ctrl+D>
David Winiecki
źródło
4

Byłem w podobnych sytuacjach, więc dodaję moje preferowane rozwiązanie, o którym nie wspomniałem. Problem git update-index --assume-unchangedw tym przypadku polega na tym, że nie można tego zrobić dla nieśledzonego pliku. Powiedziałeś

Nie mogę zmodyfikować pliku .gitignore w moim repozytorium.

Zakładam, że masz na myśli to, że nie możesz wprowadzić żadnych zmian .gitignoredo źródła. W takim przypadku możesz dodać nieśledzony plik do swojego lokalnego .gitignore, a następnie zrób git update-index --assume-unchanged .gitignoretak, aby zmiana na .gitignorenigdy nie została wypchnięta. Teraz ignorujesz (prawdopodobnie) nieśledzony plik i nie masz wpływu na .gitignoreplik zdalny .

Tony
źródło
3

Inny sposób:

  • edytuj lokalnie .gitignore
  • następnie git update-index --assume-unchanged .gitignore
langpavel
źródło