Полезные однострочники и скрипты

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

Сделать подстроку заглавной

Нужно найти паттерн и сделать его uppercase? Модификатор \U справится:

gsed -i.bak -E 's/(example)/\U\1/g' /path/to/file

Нюанс: встроенный sed в macOS не поддерживает \U. Нужен GNU sed:

brew install gnu-sed

Исправить автора коммитов

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

git-filter-repo поможет:

git filter-repo --force --commit-callback '
if commit.author_name == b"<OLD_AUTHOR_NAME>":
    commit.author_name = b"<NEW_AUTHOR_NAME>"
    commit.author_email = b"<NEW_AUTHOR_EMAIL>"
    commit.committer_name = b"<NEW_AUTHOR_NAME>"
    commit.committer_email = b"<NEW_AUTHOR_EMAIL>"
'

Сначала установи:

brew install git-filter-repo

Осторожно: это переписывает историю. Не делай так на shared-ветках без согласования с командой.

Совет: Избежать этого можно, если всегда настраивать конфиг для конкретного репозитория:

git config user.name "Work Username"
git config user.email "work@company.com"

Добавить в stage только отслеживаемые файлы

Иногда есть новые файлы, которые пока не готовы к коммиту. Эта команда добавит только изменённые и удалённые:

git add -u

Работает и с путями: git add -u src/

Посмотреть stash перед применением

Я не доверяю git stash pop. А вдруг это не тот stash? А вдруг конфликты?

Сначала смотрю изменения:

git stash show -p           # полный diff
git stash show -p stash@{2} # конкретный stash
git stash show              # только имена файлов

Потом apply (не pop!) и проверяю:

git stash apply

И только убедившись, что всё ок:

git stash drop stash@{0}

Или если нужно удалить все stash’и: git stash clear

Удалить ветку локально и на remote

Танец из двух шагов:

git branch -d feature-branch
git push origin --delete feature-branch

Используй -D вместо -d, если ветка не полностью слита.

Надоело набирать обе команды, добавил в .gitconfig:

[alias]
    nuke = "!f() { git branch -d $1 && git push origin --delete $1; }; f"

Теперь просто git nuke feature-branch.

Генерация случайных секретов

Тут часто путают: «32-символьный секрет» и «32-битный секрет» — это совсем разные вещи.

openssl rand -hex 4   # 32-bit  = 8 hex-символов
openssl rand -hex 8   # 64-bit  = 16 hex-символов
openssl rand -hex 16  # 128-bit = 32 hex-символа
openssl rand -hex 32  # 256-bit = 64 hex-символа

Каждый hex-символ кодирует 4 бита. Так что «32-символьный hex-секрет» — это на самом деле 128 бит. Это 2¹²⁸ комбинаций против 2³². Большая разница.

То же самое на Python:

import secrets
secrets.token_hex(16)  # 32 hex-символа = 128 бит

Или на Node:

require('crypto').randomBytes(16).toString('hex')

Починить Colima после краша

Классика: ноутбук сдох от разряда батареи, включаешь — а Colima не стартует. Сетевой сокет завис в сломанном состоянии.

pkill -9 -f "colima|lima|socket_vmnet|vde_vmnet" 2>/dev/null
rm -rf ~/.colima/_lima/_networks/
rm -f ~/.colima/_lima/colima/*.sock ~/.colima/_lima/colima/*.pid
colima start

Это случается достаточно часто, так что у меня есть алиас:

alias colima-fix='pkill -9 -f "colima|lima" 2>/dev/null; rm -rf ~/.colima/_lima/_networks/ ~/.colima/_lima/colima/*.sock ~/.colima/_lima/colima/*.pid; colima start'

Починить PostgreSQL после краша

Та же история с Postgres через Homebrew — stale pidfile блокирует запуск.

Быстрый фикс, который все знают:

rm -f /usr/local/var/postgresql@14/postmaster.pid
brew services restart postgresql@14

Но что если Postgres на самом деле работает? Удалять pidfile было бы плохой идеей. Вот более безопасная версия:

pg-fix() {
  local pidfile="/usr/local/var/postgresql@14/postmaster.pid"
  
  if [[ ! -f "$pidfile" ]]; then
    echo "No stale pidfile found"
    brew services restart postgresql@14
    return
  fi
  
  local pid=$(head -1 "$pidfile")
  if ps -p "$pid" > /dev/null 2>&1; then
    echo "PostgreSQL is actually running (PID $pid)"
    return 1
  fi
  
  echo "Removing stale pidfile..."
  rm -f "$pidfile"
  brew services restart postgresql@14
}

Проверяет, существует ли процесс, прежде чем что-то трогать.