👋

.gitignoreはgitignore.ioで作る

2022/04/24に公開

TL;DR

ときにはグチャグチャになる.gitignore を、簡単に作成し、きれいな状態を維持する方法について、私がいつも行っている方法を説明します。

  • .gitignore を作るためには環境把握が全て
  • 良さげな.gitignore を作ってみんなハッピー
  • コマンドラインからも簡単に作成・更新できる

.gitignoreを自動生成する

「.gitignore を用意しておいて」や「.gitignore を直しておいて」
プロジェクトが始まった直後に、ジュニアなエンジニアが良く依頼されるタスクです。 私も稀に良くお願いしますが、クセの強い.gitignore が出来てきて驚くことがあります。

  • 自分の環境しか考えていない
  • 一時ファイルの存在を忘れている
  • OS、IDE のファイルを忘れている

このような問題を避けるため、最近は.gitignore を作るサービスを利用して雛形を作成して進めるように依頼をしています。

.gitignore を作成するサービスはいくつかありますが、私が携わるプロジェクトではgitignore.ioを利用しています。

gitignore.ioで.gitignoreを作る

gitignore.io の使い方は、迷うことがありませんので、説明はしません。 大切なのは、除外対象をもれなく gitignore.io に入れることです。 そのためには、開発者の環境、利用する言語、ビルドツールなどの情報を漏れなく把握する必要があります。 私が最近開始したプロジェクトは、以下のようなプロジェクトでした。

  • 多くの開発者は、Windows で Eclipse と vscode を利用する。
  • 一部の UI 開発者は、MacOs で Intellij と vscode を利用する。
  • バックエンドの言語は Java で、ビルドツールは Maven と gradle が混在している。
  • フロントエンドの言語は veu.js+typescript で、npm を利用している。
  • 機械学習の言語は Python を利用する。
  • デプロイ関連は Ansible を利用する。

これらを整理し、gitignore.io に入力したタグは、「Windows, macOS, intellij, Eclipse, Java, vscode, Maven, Gradle, Vuejs, Python, Ansible」の 11 個です。 これらに存在するコミット管理不要なファイルを、ジュニアなエンジニアが正しく抽出し、.gitignore に落とし込むのは難しいですね。
ちなみに、これで出力されたファイルは、コメント行も含めると次のように 441 行にもなります。 実際には、この出力結果に加えて、プロジェクト独自の除外設定も追加することになります。

.gitignore
//www.toptal.com/developers/gitignore/api/windows,macos,intellij,eclipse,vscode,java,maven,gradle,vuejs,python,ansible
# Edit at https://www.toptal.com/developers/gitignore?templates=windows,macos,intellij,eclipse,vscode,java,maven,gradle,vuejs,python,ansible

### Ansible ###
*.retry

### Eclipse ###
.metadata
bin/
tmp/
*.tmp
*.bak
*.swp
*~.nib
local.properties
.settings/
.loadpath
.recommenders

# External tool builders
.externalToolBuilders/

# Locally stored "Eclipse launch configurations"
*.launch

# PyDev specific (Python IDE for Eclipse)
*.pydevproject

# CDT-specific (C/C++ Development Tooling)
.cproject

# CDT- autotools
.autotools

# Java annotation processor (APT)
.factorypath

# PDT-specific (PHP Development Tools)
.buildpath

# sbteclipse plugin
.target

# Tern plugin
.tern-project

# TeXlipse plugin
.texlipse

# STS (Spring Tool Suite)
.springBeans

# Code Recommenders
.recommenders/

# Annotation Processing
.apt_generated/
.apt_generated_test/

# Scala IDE specific (Scala & Java development for Eclipse)
.cache-main
.scala_dependencies
.worksheet

# Uncomment this line if you wish to ignore the project description file.
# Typically, this file would be tracked if it contains build/dependency configurations:
#.project

### Eclipse Patch ###
# Spring Boot Tooling
.sts4-cache/

### Intellij ###
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839

# User-specific stuff
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/**/usage.statistics.xml
.idea/**/dictionaries
.idea/**/shelf

# Generated files
.idea/**/contentModel.xml

# Sensitive or high-churn files
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
.idea/**/dbnavigator.xml

# Gradle
.idea/**/gradle.xml
.idea/**/libraries

# Gradle and Maven with auto-import
# When using Gradle or Maven with auto-import, you should exclude module files,
# since they will be recreated, and may cause churn.  Uncomment if using
# auto-import.
# .idea/artifacts
# .idea/compiler.xml
# .idea/jarRepositories.xml
# .idea/modules.xml
# .idea/*.iml
# .idea/modules
# *.iml
# *.ipr

# CMake
cmake-build-*/

# Mongo Explorer plugin
.idea/**/mongoSettings.xml

# File-based project format
*.iws

# IntelliJ
out/

# mpeltonen/sbt-idea plugin
.idea_modules/

# JIRA plugin
atlassian-ide-plugin.xml

# Cursive Clojure plugin
.idea/replstate.xml

# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties

# Editor-based Rest Client
.idea/httpRequests

# Android studio 3.1+ serialized cache file
.idea/caches/build_file_checksums.ser

### Intellij Patch ###
# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721

# *.iml
# modules.xml
# .idea/misc.xml
# *.ipr

# Sonarlint plugin
# https://plugins.jetbrains.com/plugin/7973-sonarlint
.idea/**/sonarlint/

# SonarQube Plugin
# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin
.idea/**/sonarIssues.xml

# Markdown Navigator plugin
# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced
.idea/**/markdown-navigator.xml
.idea/**/markdown-navigator-enh.xml
.idea/**/markdown-navigator/

# Cache file creation bug
# See https://youtrack.jetbrains.com/issue/JBR-2257
.idea/$CACHE_FILE$

# CodeStream plugin
# https://plugins.jetbrains.com/plugin/12206-codestream
.idea/codestream.xml

### Java ###
# Compiled class file
*.class

# Log file
*.log

# BlueJ files
*.ctxt

# Mobile Tools for Java (J2ME)
.mtj.tmp/

# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar

# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*

### macOS ###
# General
.DS_Store
.AppleDouble
.LSOverride

# Icon must end with two \r
Icon


# Thumbnails
._*

# Files that might appear in the root of a volume
.DocumentRevisions-V100
.fseventsd
.Spotlight-V100
.TemporaryItems
.Trashes
.VolumeIcon.icns
.com.apple.timemachine.donotpresent

# Directories potentially created on remote AFP share
.AppleDB
.AppleDesktop
Network Trash Folder
Temporary Items
.apdisk

### Maven ###
target/
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
pom.xml.next
release.properties
dependency-reduced-pom.xml
buildNumber.properties
.mvn/timing.properties
# https://github.com/takari/maven-wrapper#usage-without-binary-jar
.mvn/wrapper/maven-wrapper.jar

### Python ###
# 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/
pip-wheel-metadata/
share/python-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/
.nox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
*.py,cover
.hypothesis/
.pytest_cache/
pytestdebug.log

# Translations
*.mo
*.pot

# Django stuff:
local_settings.py
db.sqlite3
db.sqlite3-journal

# Flask stuff:
instance/
.webassets-cache

# Scrapy stuff:
.scrapy

# Sphinx documentation
docs/_build/
doc/_build/

# PyBuilder

# Jupyter Notebook
.ipynb_checkpoints

# IPython
profile_default/
ipython_config.py

# pyenv
.python-version

# pipenv
#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
#   However, in case of collaboration, if having platform-specific dependencies or dependencies
#   having no cross-platform support, pipenv may install dependencies that don't work, or not
#   install all needed dependencies.
#Pipfile.lock

# PEP 582; used by e.g. github.com/David-OConnor/pyflow
__pypackages__/

# Celery stuff
celerybeat-schedule
celerybeat.pid

# SageMath parsed files
*.sage.py

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

# Spyder project settings
.spyderproject
.spyproject

# Rope project settings
.ropeproject

# mkdocs documentation
/site

# mypy
.mypy_cache/
.dmypy.json
dmypy.json

# Pyre type checker
.pyre/

# pytype static type analyzer
.pytype/

# profiling data
.prof

### vscode ###
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
*.code-workspace

### Vuejs ###
# Recommended template: Node.gitignore

node_modules/
npm-debug.log
yarn-error.log

### Windows ###
# Windows thumbnail cache files
Thumbs.db
Thumbs.db:encryptable
ehthumbs.db
ehthumbs_vista.db

# Dump file
*.stackdump

# Folder config file
[Dd]esktop.ini

# Recycle Bin used on file shares
$RECYCLE.BIN/

# Windows Installer files
*.cab
*.msi
*.msix
*.msm
*.msp

# Windows shortcuts
*.lnk

### Gradle ###
.gradle

# Ignore Gradle GUI config
gradle-app.setting

# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)
!gradle-wrapper.jar

# Cache of project
.gradletasknamecache

# # Work around https://youtrack.jetbrains.com/issue/IDEA-116898
# gradle/wrapper/gradle-wrapper.properties

### Gradle Patch ###
**/build/

# End of https://www.toptal.com/developers/gitignore/api/windows,macos,intellij,eclipse,vscode,java,maven,gradle,vuejs,python,ansible

.gitignoreをGitのコマンドラインで更新する

こうやって作った.gitignore ですが、これの更新をコマンドラインから行う方法も用意されています。

今回のプロジェクトでは、プロジェクト開始後に.gitignore を更新することが、ほとんど予想されなかったため、gitignore.io の出力結果にプロジェクト固有の除外設定を追加する、ワンライナーを開発推進チームの Confluence に記載するだけに留めました。

まとめ

プロジェクトによっては、ゴミ溜めのようになっている.gitignore ですが、gitignore.io のような便利なサービスを利用することで、簡単に綺麗な状態を維持できます。 小さなプロジェクトや保守フェーズに入ったプロジェクトでは、開発推進ロールのメンバーが参画できないなどの理由から、.gitignore が整備されていないことがありますが、一度試してみてはいかがでしょうか。

一方で、.gitignore を正しく作成できないということの本質が、そこにない場合もあります。 それはプロジェクト内に開発環境全体を把握している人が居ないという、困った状況に陥っている場合です。 そのようなプロジェクトは、gitignore.io を使っても入力タグに不足が生じて、上手く除外設定を行うことができません。 gitignore.io を利用し、2〜3 回作り直しをしても.gitignore が落ち着かないプロジェクトは、開発推進またはアーキテクトレベルのエンジニアに支援を求めることをお勧めします。

Discussion