Close

Лучший способ хранения файлов с точкой перед именем: чистый репозиторий Git

Примечание: информация в заголовке немного преувеличена, поскольку есть и другие проверенные способы решения проблемы. При этом я действительно считаю, что описанный ниже способ очень удобен.

Об этом удивительном способе я недавно прочитал в ветке хакерских новостей о решениях, которые используют люди для хранения своих файлов с точкой перед именем. Пользователь StreakyCobra показал свою удобную настройку, которая показалась мне невероятно логичной. Поэтому в настоящее время я внедряю аналогичный подход в своей системе. Единственное необходимое условие — установка Git.

По его словам, описанный ниже способ

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

Суть этого способа заключается в том, чтобы сохранить чистый репозиторий Git во «вспомогательной» папке (например, $HOME/.cfg или $HOME/.myconfig) и пользоваться специально созданным псевдонимом, чтобы команды выполнялись в этом репозитории, а не в обычной локальной папке .git, и не мешали работе других репозиториев Git.


С чистого листа


Если вы раньше не отслеживали свои конфигурации в репозитории Git, это можно легко сделать с помощью следующих строк:

git init --bare $HOME/.cfg
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
config config --local status.showUntrackedFiles no
echo "alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'" >> $HOME/.bashrc
  • Первая строка создает папку ~/.cfg. Эта папка представляет собой чистый репозиторий Git, который будет отслеживать наши файлы.
  • Затем мы создаем псевдоним config, который будем использовать вместо обычного git при взаимодействии с нашим репозиторием конфигурации.
  • Устанавливаем флаг (локальный для репозитория), чтобы скрыть файлы, которые пока явно не отслеживаем. Это нужно для того, чтобы впоследствии при выполнении команды config status и других команд файлы, которые не требуется отслеживать, не отображались как untracked (неотслеживаемые).
  • Вы также можете добавить определение псевдонима в файл .bashrc вручную или использовать для удобства четвертую строку.

Я упаковал вышеприведенные строки в сниппет для Bitbucket и связал его с коротким URL-адресом, чтобы можно было выполнить настройку следующим образом:

базы данных
Связанные материалы

Перемещение полного репозитория Git

Логотип Bitbucket
СМ. РЕШЕНИЕ

Изучите Git с помощью Bitbucket Cloud

curl -Lks http://bit.do/cfg-init | /bin/bash

После настройки вы сможете управлять версиями любого файла в папке $HOME с помощью обычных команд, заменяя git созданным псевдонимом config, например:

config status
config add .vimrc
config commit -m "Add vimrc"
config add .bashrc
config commit -m "Add bashrc"
config push

Установка файлов с точкой перед именем в новой системе (или их перенос в этот репозиторий)


Если вы уже храните конфигурации или файлы с точкой перед именем в репозитории git, в рамках новой системы их можно перенести в этот репозиторий, выполнив следующие действия:

  • Перед установкой убедитесь, что вы добавили псевдоним в файл .bashrc или .zsh:
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
  • Кроме того, убедитесь в том, что исходный репозиторий игнорирует папку, в которую вы собираетесь его клонировать, чтобы не создавать странных проблем с рекурсией:
echo ".cfg" >> .gitignore
  • Затем клонируйте файлы с точкой перед именем в чистый репозиторий. Для этого понадобится отдельная папка внутри папки $HOME:
git clone --bare <git-repo-url> $HOME/.cfg
  • Определите псевдоним в текущей области видимости оболочки:
alias config='/usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME'
  • Загрузите текущий контент из чистого репозитория в папку $HOME:
config checkout
  • Предыдущий шаг может завершиться с ошибкой, и тогда появится сообщение, подобное следующему:
error: The following untracked working tree files would be overwritten by checkout:
    .bashrc
    .gitignore
Please move or remove them before you can switch branches.
Aborting

Это связано с тем, что в папке $HOME могут находиться некоторые стандартные файлы конфигурации, которые будут перезаписаны системой Git. Здесь все просто: если эти файлы вам нужны, создайте их резервную копию, а если не нужны — удалите. Хочу предложить вариант с автоматическим перемещением всех проблемных файлов в папку для резервных копий:

mkdir -p .config-backup && \
config checkout 2>&1 | egrep "\s+\." | awk {'print $1'} | \
xargs -I{} mv {} .config-backup/{}
  • Повторите переключение, если у вас возникли проблемы:
config checkout
  • Установите для флага showUntrackedFiles значение no в этом конкретном (локальном) репозитории:
config config --local status.showUntrackedFiles no
  • Готово! Теперь вы можете вводить команды config для добавления и обновления файлов с точкой перед именем:
config status
config add .vimrc
config commit -m "Add vimrc"
config add .bashrc
config commit -m "Add bashrc"
config push

Напомню, что вам не обязательно заучивать все действия на случай настройки новой машины. Чтобы ускорить работу, можно создать простой скрипт, сохранить его в качестве сниппета в Bitbucket (как это сделал я), создать для него короткий URL-адрес и вызывать следующим образом:

curl -Lks http://bit.do/cfg-install | /bin/bash

Для полноты картины хочу показать, что у меня получилось (следующий код протестирован на множестве новых контейнеров Alpine Linux):

git clone --bare https://bitbucket.org/durdn/cfg.git $HOME/.cfg
function config {
   /usr/bin/git --git-dir=$HOME/.cfg/ --work-tree=$HOME $@
}
mkdir -p .config-backup
config checkout
if [ $? = 0 ]; then
  echo "Checked out config.";
  else
    echo "Backing up pre-existing dot files.";
    config checkout 2>&1 | egrep "\s+\." | awk {'print $1'} | xargs -I{} mv {} .config-backup/{}
fi;
config checkout
config config status.showUntrackedFiles no

Подведение итогов


Надеюсь, этот метод поможет вам при отслеживании конфигурации. Если вам интересно, мои файлы с точкой перед именем хранятся здесь. Подпишитесь на меня (@durdn) или мою замечательную команду @atlassiandev, чтобы оставаться на связи.


Поделитесь этой статьей
Следующая тема

Рекомендуемые статьи

Добавьте эти ресурсы в закладки, чтобы изучить типы команд DevOps или получать регулярные обновления по DevOps в Atlassian.

Люди сотрудничают друг с другом, используя стену со множеством инструментов

Блог Bitbucket

Рисунок: DevOps

Образовательные программы DevOps

Демонстрация функций в демо-зале с участием экспертов Atlassian

Как инструмент Bitbucket Cloud работает с Atlassian Open DevOps

Подпишитесь на информационную рассылку по DevOps

Thank you for signing up