为Python项目添加.gitignore文件的最佳实践是什么?

347

我正在尝试收集一些我的默认设置,其中一个我意识到没有标准的是 .gitignore 文件。有一个很好的帖子展示了 Visual Studio 项目的良好 .gitignore,但我没有看到对于 Python 和相关工具(PyGTK、Django)的推荐。

到目前为止,我有...

*.pyc
*.pyo

...对于编译后的对象和...

build/
dist/

...用于 setuptools 输出。

.gitignore 文件有最佳实践吗?我在哪里可以找到更多关于这些最佳实践的信息?


34
这个项目 https://github.com/github/gitignore 被创建出来就是为了回答这个问题。 - Tyler
1
由于问题已关闭,我在此评论我认为应该是答案的内容。如果您使用的是PyCharm IDE,则可能需要忽略.idea/目录。这取决于您是否想共享某些/所有项目设置。这里有一个关于此问题的提问。 - Teshan Shanuka J
11
我很讨厌那些“基于观点”的问题被关闭。为什么?这不是会引发争吵的敏感话题。认识到不同的观点并不会让任何人感到不安。楼主(和我)只是想要一些最佳实践指南,他们乐意承认这些指南可能没有“正确”答案,但仍然非常有用。 - Mike Williamson
1
我知道,但在谷歌上排名很高。 - Alba Mendez
2
我尝试编辑问题,但它并没有重新打开。我也讨厌这些“基于观点”的问题。仅仅因为一个问题是“基于观点的”,并不意味着它只是一个观点。 - ekkis
显示剩余3条评论
6个回答

502

Github有一个很好的通用.gitignore

# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]

# C extensions
*.so

# Distribution / packaging
bin/
build/
develop-eggs/
dist/
eggs/
lib/
lib64/
parts/
sdist/
var/
*.egg-info/
.installed.cfg
*.egg

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
.tox/
.coverage
.cache
nosetests.xml
coverage.xml

# Translations
*.mo

# Mr Developer
.mr.developer.cfg
.project
.pydevproject

# Rope
.ropeproject

# Django stuff:
*.log
*.pot

# Sphinx documentation
docs/_build/

1
为什么我们应该忽略 *.mo 文件?仅仅出于好奇。那些 gettext 的 .po 文件是在服务器上分别编译的吗? - Ekin Ertaç
6
.mo 文件是 .po 文件的机器可读(二进制)版本,众所周知,最好将二进制文件保留在版本控制库之外,这样可以避免在版本库中包含重复数据,并且 VCS 甚至无法“压缩”这些数据。 - dappiu
9
为什么不使用.DS_Store文件? - MaxCore
2
我注意到其他答案使用了 **/__pycache__,而这个答案显然推荐来自 Github 的 __pycache__/。后者是否足够?为什么有人使用前者?这里的评论似乎表明星号不是必需的:https://dev59.com/SFMI5IYBdhLWcg3wZKrg - NeilG

91

在使用Buildout时,我的.gitignore文件中包含以下内容(与*.pyo*.pyc一起):

.installed.cfg
bin
develop-eggs
dist
downloads
eggs
parts
src/*.egg-info
lib
lib64

感谢 Jacob Kaplan-Moss

此外,由于我工作时使用了多个版本控制系统,因此我倾向于将.svn包含在内。


46
将svn代码仓库保存在与git代码仓库相同的目录结构中?这是什么样的怪物会这么做啊? - Daenyth
@Daenyth 咯咯笑,其实不是这样的,但我发现如果从其他来源获取组件(特别是在旧组件中),有时会找到一些剩余的.svn目录,而且我很懒,所以有时候我会复制检查而不是从SVN中导出文件。我甚至曾经见过一个人在GIT中提交了剩余的.svn目录。当与愚蠢的人一起工作时,你会遇到各种奇怪的事情。 - Davor Lucic
4
你应该将 *.svn 放在你的 .global_gitignore 文件中,而不是放在每个项目中。 - cowlicks
如果您使用virtualenv,则可能还需要考虑venv/*。Virtualenv允许您为每个项目设置“独立”的Python环境,因此库不会重叠或冲突。这也有助于防止“在我的电脑上运行良好但是在其他电脑上出现问题”的问题。 - SilentSteel
@SilentSteel IME venvs 存储在系统的中央位置,而不是实际目录中。 - Cruncher

42

涵盖大部分一般内容 -

# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST

# PyInstaller
#  Usually these files are written by a python script from a template
#  before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
.hypothesis/
.pytest_cache/

# Translations
*.mo
*.pot

# Django stuff:
*.log
local_settings.py
db.sqlite3

# Flask stuff:
instance/
.webassets-cache

# Scrapy stuff:
.scrapy

# Sphinx documentation
docs/_build/

# PyBuilder
target/

# Jupyter Notebook
.ipynb_checkpoints

# pyenv
.python-version

# celery beat schedule file
celerybeat-schedule

# SageMath parsed files
*.sage.py

# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/

# Spyder project settings
.spyderproject
.spyproject

# Rope project settings
.ropeproject

# mkdocs documentation
/site

# mypy
.mypy_cache/

参考:python .gitignore


1
@Emmanuel,其他答案提到的不是通用的样板,它有很多不必要的东西。这里提到的是通用的Django/Python。 - Ani Menon
1
在使用Jython时,提到*$py.class是很有用的。 - undefined

17

这很有道理。我喜欢将通用配置与特定/本地/私有配置分离的方法。 - ewall
这是如何工作的?也就是说,Django或Python如何知道环境是本地还是生产环境? - MadPhysicist

7

有一个问题是,如果您也想使用git来部署您的项目,那么您可能希望将本地的sqlite文件从存储库中排除掉,对于文件上传(通常在媒体文件夹中),同样适用此方法。(我现在正在谈论django,因为您的问题也标记有django)


明白了。由于Django并不强制要求文件名和目录结构,因此很难提前指定这些内容。但是我至少可以做个记录,以便在创建新项目时记得这一点。 - ewall
好吧,我想你至少应该将所有用户上传的文件放在媒体目录下的一个文件夹中,例如 media/uploads,这样你就可以用一条规则“忽略”它们全部... - Bernhard Vallant

6
以下是setuptools可能留下的其他文件:
MANIFEST
*.egg-info

我认为我可能会将它们从我的默认设置中删除,因为我的一些项目具有需要它们的setuptools分发。但对于插件等,是的。 - ewall

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接