Всем привет, в этом небольшом гайде расскажу как я синхронизирую свои заметки Obsidian сохраняя все 4 свойства. Мне кажется это золотой стандарт для настройки синхронизации Obsidian и в этом гайде поэтапно расписал как провернуть эту схему у себя.

С чем имеем дело:

  • редактор заметок, в моём случае Obsidian, но подойдёт любой; в Obsidian есть плагин который упростит работу с Git до пары кнопок

  • git и git хранилище, я использую GitHub, но можно GitLab, Codeberg или любой другой

  • git-crypt — утилита для прозрачного шифрования файлов прямо внутри репозитория

  • gpg — для генерации асимметричных ключей; если не хочется заморачиваться, можно обойтись симметричным .bin ключом

  • плагин obsidian git — чтобы пушить и пуллить прямо из Obsidian, без терминала

Как это всё работает: git-crypt цепляется к Git через фильтры clean и smudge. При git add файл шифруется AES-256 и уходит на сервер в виде нечитаемого бинарника. При git pull — расшифровывается обратно. Ты работаешь с обычными markdown файлами, шифрование происходит незаметно. Плагин Obsidian Git просто вызывает стандартные git-команды изнутри Obsidian, поэтому с git-crypt работает без каких-либо проблем.

установка

sudo pacman -S gnupg git-crypt

Debian/Ubuntu

sudo apt install gnupg git-crypt

Сначала фиксим права на папку, без этого gpg иногда ругается

chmod 700 ~/.gnupg
find ~/.gnupg -type f -exec chmod 600 {} \;
find ~/.gnupg -type d -exec chmod 700 {} \;

Создаём ключ

gpg --full-generate-key

В меню:

  • тип 1 - rsa

  • размер 4096

  • срок 0 - не истекает

  • имя и email

  • придумываем пароль - пароль понадобится при каждом git-crypt unlock

Смотрим что создалось

gpg --list-secret-keys --keyid-format long
sec   rsa4096/BC1669B94DC2FA3B 2026-03-10 [SC]
      A24F8B816C123B0B342234555C2ACA254BC1669B
uid   user <mail@email.com>

email отсюда понадобится на следующем шаге

По желанию можно настроить кэш пароля на 24 часа, чтобы не вводить при каждом unlock

echo "default-cache-ttl 86400" >> ~/.gnupg/gpg-agent.conf
echo "max-cache-ttl 86400" >> ~/.gnupg/gpg-agent.conf
gpgconf --reload gpg-agent

Репозиторий

cd ~/notes
git init
git-crypt init
git-crypt add-gpg-user --trusted mail@email.com

Создаём .gitignore исключаем системные файлы Obsidian которые не нужно синхронизировать

.obsidian/workspace.json
.obsidian/workspace-mobile.json
.obsidian/cache
.trash/

Создаём .gitattributes говорим git-crypt что шифровать а что нет

.gitattributes !filter !diff
.gitignore !filter !diff

*.md     filter=git-crypt diff=git-crypt
*.canvas filter=git-crypt diff=git-crypt
*.png    filter=git-crypt diff=git-crypt
*.jpg    filter=git-crypt diff=git-crypt
*.jpeg   filter=git-crypt diff=git-crypt
*.pdf    filter=git-crypt diff=git-crypt

Порядок коммитов важен, сначала только .gitattributes потом остальное. Если закоммитить всё разом, git-crypt не успевает применить фильтры и файлы уйдут в открытом виде:

git add .gitattributes
git commit -m "$(date '+%Y-%m-%d %H:%M')"

git add .
git commit -m "$(date '+%Y-%m-%d %H:%M')"

Проверяем статус шифрования

git-crypt status | grep WARNING

Пушим

git remote add origin git@github.com:username/notes.git
git branch -M main
git push -u origin main

Obsidian Git плагин

Открываем Obsidian, идём в Settings → Community Plugins → Browse, ищем Git (автор Vinzent), устанавливаем и включаем.
В настройках плагина настраиваем как нам удобно.
Теперь плагин сам тянет изменения при запуске Obsidian и автоматически коммитит и пушит по расписанию.
Вручную можно через Ctrl+P "Obsidian Git: Commit-and-sync" или кнопку в интерфейсе.

Важно: открывать Obsidian только после git-crypt unlock в терминале. Если открыть раньше — увидишь GITCRYPT... вместо заметок, плагин будет пытаться запушить мусор. Закрыть Obsidian, разблокировать в терминале, открыть снова.

Pre-commit хук

Хук блокирует коммит если файлы которые должны быть зашифрованы идут в открытом виде. Создаём файл .githooks/pre-commit

mkdir -p .githooks
touch .githooks/pre-commit
chmod +x .githooks/pre-commit

.githooks/pre-commit

#!/bin/bash
for file in $(git diff --cached --name-only); do
    if git check-attr filter "$file" | grep -q "git-crypt"; then
        string=$(git show ":$file" 2>/dev/null | head -c 9)
        if [ "$string" != $'\x00GITCRYPT' ]; then
            echo "file '$file' is not encrypted man be carefully"
            exit 1
        fi
    fi
done
exit 0
git config core.hooksPath .githooks
git add .githooks/pre-commit
git commit -m "$(date '+%Y-%m-%d %H:%M')"

Перенос на другое устройство

На старом устройстве:

gpg --export-secret-keys --armor mail@email.com > ~/key.asc

Копируем на новое через scp или флешку. На новом:

gpg --import ~/my-gpg-key.asc
git clone git@github.com:username/notes.git
cd notes
git-crypt unlock

Удаляем файл ключа с обоих устройств:

rm ~/my-gpg-key.asc

Открываем Obsidian, выбираем "Open folder as vault", указываем папку с клонированным репозиторием. Устанавливаем плагин Obsidian Git, выставляем те же настройки.

Бэкап GPG ключа

Без ключа и пароля доступ к заметкам потерян навсегда

gpg --export-secret-keys --armor mail@email.com > ~/backup-gpg.asc

Кладём в менеджер паролей или на внешний диск, после этого удаляем

rm ~/backup-gpg.asc

Cимметричный ключ без GPG

Если не хочется разбираться с GPG git-crypt умеет работать с обычным .bin ключом.

git-crypt export-key ~/key.bin

Удобный хак переводим его в base64 и храним как строку в менеджере паролей, не нужно таскать бинарный файл

base64 -i ~/key.bin

На новом устройстве:

echo "base64 string" | base64 -d > key.bin
git-crypt unlock key.bin

Минус: ключ не защищён паролем, если строка утечёт из менеджера паролей, заметки расшифруются.