В прошлом посте вы узнали про git --bare, а в этом вы узнаете зачем вы про это узнали.
В какой-то момент вашей жизни вам вдруг хочется чтобы одни и те же конфиги были на разных компьютерах и для этого вам их нужно с чем-то синхронизировать. Все как-то договорились что это делается через репозиторий с именем dotfiles.
В посте на реддите люди называют три способа.
1. gnu stow + git
Этот stow просто хранит всё в какой-то дирректории, а потом указывает туда симлинками, например:
~/.config/nvim/ > ~/.stow/.config/nvim/
Мне просто не нравится.
2. yadm: Yet Another Dotfiles Manager
Сложно!
3. git --blame
Можно случайно добавить самого себя, но можно и не добавлять.
~/.dotfiles/В том же посте рассказывают как всё делать и есть даже ссылка на блог (в котором нет rss!).
Я делаю всё так же как в этом блоге, но кладу гит на +1 уровень вложенности в ~/.dotfiles/git--bare/ и это даёт мне возможность добавить файл ~/.dotfiles/readme.md в котором я напишу как этим пользоваться.
Просто когда я это настраиваю в первый раз — мне несложно, а как потом этим пользоваться на втором устройстве? Я неумный, я не могу запомнить, мне нужно записать все шаги.
0. далёкий репозиторий
Создайте у себя в гитхабе приватный dotfiles репозиторий и найстройте ssh чтобы всё работало.
1. первый коммит
Создаём репозиторий, можете переименовывать всё как угодно
$ cd ~ $ mkdir -p ~/.dotfiles/git--blame/ $ git init --bare ~/.dotfiles/git--bare/ $ echo 'hello world' > ~/.dotfiles/readme.md
Делаем первый коммит, проверяем что всё работает
$ git --git-dir="$HOME/.dotfiles/git--bare/" --work-tree="$HOME" add ~/.dotfiles/readme.md $ git --git-dir="$HOME/.dotfiles/git--bare/" --work-tree="$HOME" config set --local user.name "hello" $ git --git-dir="$HOME/.dotfiles/git--bare/" --work-tree="$HOME" config set --local user.name "mail@example.com" $ git --git-dir="$HOME/.dotfiles/git--bare/" --work-tree="$HOME" commit -m 'initial commit' $ git --git-dir="$HOME/.dotfiles/git--bare/" --work-tree="$HOME" log
Если коммит случился — мы радуемся.
Но радуемся несильно потому что это больно и глупо. Создаём в рыбе функцию (ну или алиасьте там как умеете я не осуждаю):
$ cat ~/.config/fish/functions/dotfiles.fish
function dotfiles
command git --git-dir="$HOME/.dotfiles/git--bare/" --work-tree="$HOME" $argv
end
Теперь у нас есть функция, её мы проверяем:
$ dotfiles status
Если вам стало неприятно от моего совета, то это хорошо! Теперь вызывая dotfiles мы как бы вызываем git, но со странными параметрами.
Теперь мы можем отключить показ недобавленных файлов:
$ dotfiles status $ dotfiles config --local status.showUntrackedFiles not $ dotfiles status
2. синхронизация
$ dotfiles remote add github <url> $ dotfiles push
3. безумие время
$ dotfiles add ~/.config/fish/ $ dotfiles commit -m '`~/.config/fish/`' $ dotfiles push
Что выполнять на настоящем втором устройстве вы найдёте ниже, а тут мы проверим что всё работает на этом же устройстве. И убедимся что мы понимаем как это работает,
потому что если мы не понимаем мы могли бы пользоваться yadm например.
$ mkdir /tmp/dotfiles-sandbox/ $ cd /tmp/dotfiles-sandbox/ $ git clone --bare <url> /tmp/dotfiles-sandbox/.dotfiles/git--bare/ $ git --git-dir="/tmp/dotfiles-sandbox/.dotfiles/git--bare/" --work-tree="/tmp/dotfiles-sandbox/" reset --hard $ ls
Если файлы внезапно появились, то мы всё сделали правильно. Теперь делаем коммит:
$ git --git-dir="/tmp/dotfiles-sandbox/.dotfiles/git--bare/" --work-tree="/tmp/dotfiles-sandbox/" config --local status.showUntrackedFiles no; $ git --git-dir="/tmp/dotfiles-sandbox/.dotfiles/git--bare/" --work-tree="/tmp/dotfiles-sandbox/" config set user.name "temp" $ git --git-dir="/tmp/dotfiles-sandbox/.dotfiles/git--bare/" --work-tree="/tmp/dotfiles-sandbox/" config set user.email "temp" $ date >> /tmp/dotfiles-sandbox/.dotfiles/readme.md $ git --git-dir="/tmp/dotfiles-sandbox/.dotfiles/git--bare/" --work-tree="/tmp/dotfiles-sandbox/" add /tmp/dotfiles-sandbox/.dotfiles/readme.md $ git --git-dir="/tmp/dotfiles-sandbox/.dotfiles/git--bare/" --work-tree="/tmp/dotfiles-sandbox/" commit -m '`.dotfiles/readme.md`' $ git --git-dir="/tmp/dotfiles-sandbox/.dotfiles/git--bare/" --work-tree="/tmp/dotfiles-sandbox/" push
Если всё работает то всё работает.
$ rm -Rf /tmp/dotfiles-sandbox/
Вам может быть непонятно зачем это если на втором устройстве ничего не настроено, но:
1. вы можете посмотреть это файл прямо в гитхабе
2. вы всё равно должны как-то передать урл на второе устройство и настроить там ssh
А если у вас там всё это работает, то вы всегда можете сделать:
$ git clone <url> /tmp/dotfiles-temp/ $ cat /tmp/dotfiles-temp/.dotfiles/readme.md $ rm -Rf /tmp/dotfiles-temp/
Вот вам содержимое ~/.dotfiles/readme.md, вы его поменяйте, поменяйте, сохраните и запушьте сами.
```
### init, first machine
$ mkdir -p ~/.dotfiles/git--blame/
$ git init --bare ~/./dotfiles/git--bare/
$ echo 'hello world' > ~/.dotfiles/readme.md
$ git --git-dir="$HOME/.dotfiles/git--bare/" --work-tree="$HOME" add ~/.dotfiles/readme.md
$ git --git-dir="$HOME/.dotfiles/git--bare/" --work-tree="$HOME" config set --local user.name "hello"
$ git --git-dir="$HOME/.dotfiles/git--bare/" --work-tree="$HOME" config set --local user.name "mail@example.com"
$ git --git-dir="$HOME/.dotfiles/git--bare/" --work-tree="$HOME" commit -m 'initial commit'
$ git --git-dir="$HOME/.dotfiles/git--bare/" --work-tree="$HOME" log
# fish function / alias
$ cat ~/.config/fish/functions/dotfiles.fish
function dotfiles
command git --git-dir="$HOME/.dotfiles/git--bare/" --work-tree="$HOME" $argv
end
# check function / alias and hide new files notifications
$ dotfiles status
$ dotfiles config --local status.showUntrackedFiles not
$ dotfiles status
# add remote
$ dotfiles remote add github <url>
$ dotfiles push
# add first config
$ dotfiles add ~/.config/fish/
$ dotfiles commit -m '`~/.config/fish/`'
$ dotfiles push
```
```
### second machine
# be smart, create fish function / alias first
$ cat ~/.config/fish/functions/dotfiles.fish
function dotfiles
command git --git-dir="$HOME/.dotfiles/git--bare/" --work-tree="$HOME" $argv
end
# deploy, but be careful: you can ruin existing files. Handle it somehow, I won't fight your internal coflicts!
$ git clone --bare <url> ~/.dotfiles/git--bare/
$ dotfiles status
$ dotfiles config --local status.showUntrackedFiles not
$ dotfiles status
$ dotfiles config set --local user.name "hello 2nd machine"
$ dotfiles config set --local user.name "mail@example.com"
```
Поздравляшки, теперь вы нерд!
#linux #howto #man #dotfiles #git
2025.11.10 00:31