Требуется автоматический коммит в стиле «моментального снимка», который сквош сбрасывается, когда у вас есть настоящий коммит.
Вот моя грубая идея:
- Считайте
master
вашей "официальной" шкалой времени коммита и работайте в ветви функций. (В любом случае, это довольно ортодоксальный рабочий процесс.)
- Работа в так называемой ветви функций, которая делает автоматические снимки (с помощью предварительной команды zsh)
- Когда вы будете готовы к (человеческому) принятию, объедините все автоматические снимки из вашей функциональной ветви в мастер с
--squash
и подтвердите с соответствующим сообщением.
Для этого могут потребоваться некоторые псевдонимы как в zsh, так и в git, но я думаю, что это может сработать. Вот несколько грубых идей, ключевым из которых является git merge - сквош. (Также, извините, я говорю только на Bash.)
# I type this manually when I start work in the morning.
start-snapshotting () {
git checkout -b auto-snapshots master
PROMPT_COMMAND=git-snapshot
}
git-snapshot () {
branch=`git symbolic-ref HEAD`
[ "$branch" = "refs/heads/auto-snapshots" ] || return 1
git add . && \
git status > /dev/null &&
git commit -m 'Automatic snapshot'
}
# Do a real commit that I am interested in preserving.
# Parameters are passed unmodified to "git commit"
commit () {
git checkout master && \
git merge --squash auto-snapshots && \
git commit "$@" && \
git branch -D auto-snapshots && \
git checkout -b auto-snapshots master
}
# I type this when I am done coding.
stop-snapshotting () {
unset PROMPT_COMMAND
git checkout master && \
git branch -D auto-snapshots
}
Имейте в виду, что будет тонн граничных случаев, таких как файлы, которые вы должны были добавить в .gitignore, и я уверен, что многие другие. Но я думаю, что это может сработать.