Git зберігає кожну версію кожного файлу назавжди. Видалений пізніше файл лишається в історії, і кожен клон завантажує його знову. Тому в репозиторій потрапляє лише те, що не можна відтворити.
vendor/ і node_modules/ відтворюються з composer.json + composer.lock і package.json + package-lock.json:
composer install
npm ci
Якщо їх комітити:
- розмір: десятки тисяч файлів і сотні мегабайтів, а кожне оновлення пакета додає нові версії файлів в історію назавжди;
- шум у diff і pull request: оновлення однієї залежності - тисячі змінених рядків, серед яких не видно власного коду;
- конфлікти при злитті гілок, що оновлювали різні пакети;
- бінарні частини (нативні модулі npm) скомпільовані під конкретну ОС і не працюватимуть на іншій.
Що ще не комітять:
| Що | Чому |
|---|---|
.env |
секрети й налаштування конкретного середовища (комітять .env.example) |
public/build, public/hot |
результат npm run build / dev-сервера |
storage/logs, storage/framework/* |
логи, кеш, сесії, скомпільовані шаблони |
bootstrap/cache/*.php |
кеш конфігурації й маршрутів |
| дампи бази, архіви, відео | великі бінарні файли, часто з персональними даними |
.idea/, .vscode/, .DS_Store |
налаштування конкретного розробника (краще в глобальний ignore) |
Новий Laravel-проєкт уже містить відповідний .gitignore, а в каталогах storage/ - вкладені .gitignore, що зберігають структуру каталогів, але ігнорують вміст.
Що обов'язково комітять: composer.lock і package-lock.json для застосунку - вони гарантують однакові версії пакетів у всіх. (Для бібліотеки composer.lock зазвичай не комітять: версії визначає застосунок, що її встановлює.)
Якщо файл уже в репозиторії, додавання в .gitignore не допоможе - Git продовжує його відстежувати:
git rm -r --cached vendor
git commit -m "Stop tracking vendor"
З історії він при цьому не зникає - для цього потрібне переписування історії.
Докладніше в документації: Composer: чи комітити каталог vendor