Перейти к основному содержимому

Дружим Garry's Mod сервер и Git правильно

· 5 мин. чтения

Я годами не мог придумать, как сделать, чтобы на Git хранились только самые необходимые файлы и папки без мусорных (cache, backgrounds, console.log и т.д.). Казалось бы, простая задача, но решил я ее лишь недавно.

Демонстрация ожидаемой структуры проекта

Это все нужно было для того, чтобы удобно работать с сервером через плагин VSCode Remote SSH, словно сервер находится на локалке и при этом любые изменения с легкостью пушить на GitHub без лишнего мусора

Финальный результат

Чтобы репозиторий был без сотен или тысяч других файликов, к которым мы никогда не полезем.

  • чтобы корень git репозитория был /garrysmod
  • сохранить из /cfg лишь несколько файлов из десятка
  • из /gamemodes только 1 папку вместо 3-4
  • из /data только то, что +- статично (не логи, а конфиги и т.д.)
  • из /lua только /lua/bin (если он есть)

Зачем, а главное нахYя

баннер с важным вопросом

Во-первых, потому что так надо. Во-вторых, потому что я так захотел. Что еще нужно то 🤗?

Вообще, я решал проблему удаленной разработки. Раньше я использовал плагин SFTP для VSCode. Он работает по примитивному принципу: сохранил файл, он запушил его по SFTP на сервер. У плагина были недостатки:

  • Он требовал чтобы локально у тебя была точная копия файлов сервера. Проблема, когда у тебя пара мест, в которых ты регулярно бываешь.

  • Если кто-то менял файл на сервере, то твоя локальная копия уже отличалась от файлов на сервере. Проблема, когда работаешь с кем-то или нужно срочно пофиксить баг прямо на сервере.

  • Если кто-то поменял файл прямо на git, то он сам не попадет на сервер, пока его вручную туда не обновить. Проблема, когда у тебя не 1 файлик, а 10+. Нужно сначала делать git pull на локалке, затем каждый измененный файлик пересохранять, чтобы он попал на сервер.

Без SFTP плагина я могу изменять код хоть на сервере, хоть дома на компе, хоть на самом гитхаб, хоть играться с git ветками и синхронизация всего этого будет на кончике пальцев: git pull. Можно даже прихуярить монитор приделать workflow автоматического деплоя на продакшен при пуше в master, но это отдельная история.

Последовательность действий

  1. Создать пустой приватный GitHub репозиторий.
  2. Настроить ключи доступа, чтобы выполнять git-команды без пароля.
  3. Залить сборку гмод сервера прямо с VDS в новоиспеченный пустой репозиторий. Уже без лишних файлов.

Для начала регистрируйтесь на GitHub, создавайте приватный репозиторий, на сервере настройте SSH ключ для доступа к приватным репозиториям: инструкция. Когда сможете без логина/пароля сделать git pull git@github.com:ВАШ-ЛОГИН/ВАШ-РЕПОЗИТОРИЙ.git, тогда и продолжаем.

Приступаем к загрузке в наш пустой репозиторий основных файлов нашего сервера:

# В корне папки сервера (в папке /garrymod)
git init
git remote add origin git@github.com:ВАШ-ЛОГИН/ВАШ-РЕПОЗИТОРИЙ.git
git fetch

# PRO Tip: Если вводить через терминал VSCode,
# то файл откроется именно в VSCode
# и не придется мучиться со всякими nano/vim/micro
code .gitignore

.gitignore сейчас пустой, мы его только создаем. Этот файл отвечает за то, какие файлы попадут или НЕ попадут на Git.

Ниже скриншота мое содержимое .gitignore. Отредактируйте под свои нужды, пока команда git status не перестанет показывать ненужные файлы. Финально должно получиться примерно так:

git status output example

Содержимое моего .gitignore
# Игнорируем целые ненужные папки
/backgrounds
/bin
/cache
/download
/downloads
/downloadlists
/fallbacks
/html
/maps
/particles
/resource
/scenes
/settings

# Игнорируем в корневой папке все ФАЙЛЫ (не папки), кроме парочки (sv.db, console.log, etc)
/*.*
!/.gitignore
!/*.code-workspace
# !/sv.db
# !/console.log

# /cfg файлы, кроме выбранных
/cfg/*
!/cfg/autoexec.cfg
!/cfg/mount.cfg
!/cfg/server.cfg
!/cfg/server.vdf

# Игнорируем в /data все, кроме некоторых конфижных и редкоизменяемых файлов
# Это убило часа 3 моей жизни, потому что я не мог додуматься поставить .* в конце, а ставил просто /*
# Для .gitignore когда пишешь /* он думает про непонятно что, а /*.* имеется в виду "что-то.расширение"
# Боже, надеюсь я не забуду этой логики. https://www.atlassian.com/ru/git/tutorials/saving-changes/gitignore
# Короче НЕЛЬЗЯ игнорить папку, иначе тогда "!" в начале не работает. Приходится форсить игнор файлов в папке
# /** в конце значит, что игнорим дальше даже папки и файлы в подходящих папках. Короче жрем даже слеши
# /* игнорим только файлы до слеша. Поэтому в /perments **
/data/**/*.*
!/data/ghomes_system/**
/data/ghomes_system/mails
!/data/trigon_scripts/perments/**
!/data/ulib/groups.txt
!/data/ulx/adverts.txt
!/data/ulx/banreasons.txt
!/data/ulx/gimps.txt
!/data/vcmod/fuelstations/*
!/data/vcmod/repairman/maps/*

# Из /lua папки убираем все, кроме /lua/bin
/lua/*
!/lua/bin

# Из /gamemodes убираем base, sandbox, terrortown (остается darkrp и если что-то будет еще создано, то оно тоже)
/gamemodes/*
!/gamemodes/darkrp
# /gamemodes/base
# /gamemodes/sandbox
# /gamemodes/terrortown

# Игнорируем тяжелые файлы
# # models & materials
# *.xcf
# *.mdl
# *.phy
# *.vtx
# *.vvd
# *.vmt
# *.vtf
# *.pcf

# # sounds
# *.wav
# *.mp3
# *.ogg

# # web shit
# *.eot
# *.svg
# *.ttf
# *.woff
# *.otf

# macos shit
*.DS_Store

Если лишние файлы не подсвечиваются, то загружаем все на GitHub:

git add --all
git push
# проверьте, появились ли ваши файлы на GitHub

ералаш - все


подсказка

Если что не так или информация в посте устарела – свистните в комментах. Я очень быстро его замечу (придет оповещение) и отвечу вам, что исправил пост, помогу с проблемой или забью хер.

В конце концов, натолкайте мне в комменты ху@в о том, какой я дурак и все делаю не так. Или хотя бы мем какой-то скиньте, чтобы я знал что кто-то потратил свое время на это чтиво.