Ignoruj ​​pliki .pyc w repozytorium git

107

Jak mogę zignorować .pycpliki w git?

Jeśli to włożę, .gitignoreto nie działa. Potrzebuję, aby nie były śledzone i nie były sprawdzane pod kątem zatwierdzeń.

enfix
źródło
4
.gitignore powinno działać. Czy możesz dostarczyć kopię wierszy, które umieściłeś w .gitignore, aby spróbować rozwiązać ten problem?
Al Riddoch,

Odpowiedzi:

41

Włóż to .gitignore. Ale ze strony podręcznika gitignore(5):

  ·   If the pattern does not contain a slash /, git treats it as a shell
       glob pattern and checks for a match against the pathname relative
       to the location of the .gitignore file (relative to the toplevel of
       the work tree if not from a .gitignore file).

  ·   Otherwise, git treats the pattern as a shell glob suitable for
       consumption by fnmatch(3) with the FNM_PATHNAME flag: wildcards in
       the pattern will not match a / in the pathname. For example,
       "Documentation/*.html" matches "Documentation/git.html" but not
       "Documentation/ppc/ppc.html" or
       "tools/perf/Documentation/perf.html".

Zatem podaj pełną ścieżkę do odpowiedniego *.pycwpisu lub umieść go w .gitignorepliku w dowolnym katalogu prowadzącym z katalogu głównego repozytorium (włącznie).

Ignacio Vazquez-Abrams
źródło
6
Żeby nie pomylić kogokolwiek innego, Ignacio interpretacja strony podręcznika jest błędna. Nie musisz umieszczać * .pyc w tym samym katalogu, wystarczy umieścić go w katalogu nadrzędnym (lub dziadku itp.).
Godsmith
@Godsmith: poprawione.
Ignacio Vazquez-Abrams
242

Powinieneś dodać linię z:

*.pyc 

do .gitignorepliku w folderze głównym drzewa repozytorium git zaraz po inicjalizacji repozytorium.

Jak powiedział ralphtheninja , jeśli zapomniałeś to zrobić wcześniej, jeśli po prostu dodasz linię do .gitignorepliku, wszystkie wcześniej zatwierdzone .pycpliki będą nadal śledzone, więc będziesz musiał usunąć je z repozytorium.

Jeśli korzystasz z systemu Linux (lub „rodziców i synów”, takich jak MacOSX), możesz to szybko zrobić za pomocą tego jednego wiersza polecenia, które musisz wykonać z katalogu głównego repozytorium:

find . -name "*.pyc" -exec git rm -f "{}" \;

To po prostu oznacza:

zaczynając od katalogu, w którym aktualnie jestem, znajdź wszystkie pliki, których nazwa kończy się rozszerzeniem .pyc, i przekaż nazwę pliku do poleceniagit rm -f

Po *.pycusunięciu plików z gita jako plików śledzonych, zatwierdź tę zmianę w repozytorium, a następnie możesz ostatecznie dodać *.pyclinię do .gitignorepliku.

(na podstawie http://yuji.wordpress.com/2010/10/29/git-remove-all-pyc/ )

Enrico M.
źródło
3
Alternatywnie, aby usunąć pliki z git i z lokalnego komputera, możesz po prostu zrobić to git rm --cached *.pycz katalogu najwyższego poziomu. Mam to stąd
Anupam,
Mam, że istnieje, ale po zatwierdzeniu plików .pyc i tak są one śledzone przez git, powinieneś je najpierw usunąć i zatwierdzić, jeśli masz je w repozytorium
Mahmoud Hboubati
84

Prawdopodobnie dodaje je do repozytorium przed wprowadzeniem *.pycw .gitignore.
Najpierw usuń je z repozytorium.

ralphtheninja
źródło
3

próbuję użyć zdania z poprzedniego postu i nie działam rekurencyjnie, potem przeczytaj pomoc i uzyskaj tę linię:

find . -name "*.pyc" -exec git rm -f "{}" \;

pd jest konieczne, aby dodać * .pyc do pliku .gitignore, aby utrzymać git w czystości

echo "*.pyc" >> .gitignore

Cieszyć się.

Dario Roman Garcia Gonzalez
źródło
2

Jeśli chcesz globalnie ignorować pliki '.pyc' (tj. Jeśli nie chcesz dodawać linii do pliku .gitignore w każdym katalogu git), spróbuj wykonać następujące czynności:

$ cat ~/.gitconfig 
[core]
    excludesFile = ~/.gitignore
$ cat ~/.gitignore
**/*.pyc

[Źródła]
https://git-scm.com/docs/gitignore

  • Wzorce, które użytkownik chce, aby Git ignorował we wszystkich sytuacjach (np. Kopie zapasowe lub pliki tymczasowe generowane przez wybrany edytor użytkownika) zazwyczaj trafiają do pliku określonego przez core.excludesFile w pliku ~ / .gitconfig użytkownika.

  • Początkowe „**”, po którym następuje ukośnik, oznacza dopasowanie we wszystkich katalogach. Na przykład „** / foo” dopasowuje plik lub katalog „foo” w dowolnym miejscu, tak samo jak wzorzec „foo”. „** / foo / bar” dopasowuje plik lub katalog „bar” gdziekolwiek bezpośrednio w katalogu „foo”.

Tae Kim
źródło
0

Dzięki @Enrico za odpowiedź.

Zwróć uwagę, że jeśli używasz virtualenv, będziesz mieć kilka dodatkowych .pycplików w katalogu, w którym aktualnie się znajdujesz, które zostaną przechwycone przez jego polecenie find.

Na przykład:

./app.pyc
./lib/python2.7/_weakrefset.pyc
./lib/python2.7/abc.pyc
./lib/python2.7/codecs.pyc
./lib/python2.7/copy_reg.pyc
./lib/python2.7/site-packages/alembic/__init__.pyc
./lib/python2.7/site-packages/alembic/autogenerate/__init__.pyc
./lib/python2.7/site-packages/alembic/autogenerate/api.pyc

Przypuszczam, że usunięcie wszystkich plików jest nieszkodliwe, ale jeśli chcesz usunąć tylko .pycpliki z głównego katalogu, po prostu zrób

find "*.pyc" -exec git rm -f "{}" \;

Spowoduje to usunięcie tylko app.pycpliku z repozytorium git.

Andy G.
źródło