Создание git автоматического фиксации

Я хотел бы использовать git для записи всех изменений в файл.

Есть ли способ, по которому я могу превратить git 'commit' в автоматическое выполнение при каждом обновлении файла - так что есть новая фиксация для каждого изменения файла?

В идеале я бы хотел, чтобы мои пользователи даже не знали, что git работает за кулисами. Затем пользователь мог бы "отменить" изменения в файле - и этого можно добиться, вытащив предыдущую версию из git.

Ответ 1

В Linux вы можете использовать inotifywait, чтобы автоматически выполнять команду каждый раз при изменении содержимого файла.

Изменить: следующая команда фиксирует файл .txt сразу после его сохранения:

inotifywait -q -m -e CLOSE_WRITE --format="git commit -m 'autocommit on change' %w" file.txt | sh

Ответ 2

Более ранний ответ inotifywait велик, но это не совсем полное решение. Как написано, это однократная фиксация для одноразового изменения в файле. Это не работает для общего случая, когда редактирование файла создает новый индексный дескриптор с исходным именем. inotifywait -m, очевидно, следует за файлами inode, а не по имени. Кроме того, после изменения файла он не помещается для git commit без git добавить или git commit -a, Сделав некоторые настройки, вот что я использую на Debian для отслеживания всех изменений в моем файле календаря:

/etc/rc.local:


su -c /home/<username>/bin/gitwait -l <username>

/главная/< & имя пользователя GT;/бен/gitwait:


#!/bin/bash
#
# gitwait - watch file and git commit all changes as they happen
#

while true; do

  inotifywait -qq -e CLOSE_WRITE ~/.calendar/calendar

  cd ~/.calendar; git commit -a -m 'autocommit on change'

done

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

Ответ 3

Предыдущие ответы, рекомендующие inotifywait для этого задания, опрокинули меня в правильном направлении, когда у меня была эта проблема, поэтому я написал немного script. Во-первых, это может только рекурсивно смотреть целые папки (напротив примера Lester Buck), но потом я также хотел посмотреть файл где-то еще, поэтому я расширил его.

В результате получается script gitwatch, так как это то, что он делает: он отслеживает файл или папку для изменений (используя inotifywait) и записывает их в git репозиторий.

Вы можете найти script, более подробную информацию и инструкции по github: https://github.com/nevik/gitwatch

Ответ 4

git-wip - отличное решение, которое хорошо работает для меня. "WIP" означает "незавершенная работа". Каждый раз, когда вы запускаете "git wip", изменения переносятся в отдельную ветвь. Его можно запустить в командной строке, но есть расширения для vim и emacs для автоматического запуска git -wip каждый раз, когда файл написан.

Ответ 5

Я хотел сделать это в окнах и нашел, что лучший способ - использовать Directory Monitor, чтобы проверить изменения, затем, когда он обнаружил изменение, запустил:

Программа: cmd.exe

Парамс:/C C:\pathToBatchFile.bat

Этот командный файл содержит:

c:
cd c:\gitRepoDirectory\
(if exist "%PROGRAMFILES(X86)%" (
"%PROGRAMFILES(X86)%\git\bin\sh.exe" --login -i -c "git commit -am AutoCommitMessage"
) else (
"%PROGRAMFILES%\git\bin\sh.exe" --login -i -c "git commit -am AutoCommitMessage"
))

Я также попробовал добавить еще одну команду для добавления файлов ("%PROGRAMFILES(X86)%\git\bin\sh.exe" --login -i -c "git add *.*"), но я не думаю, что у меня это нормально работает.

Я также сделал крюк после фиксации, содержащий:

#!/bin/sh
git.exe pull -v --progress  "origin"
git.exe push    --progress  "origin" master:master
curl.exe -s https://webserverdomain.com/updateFromGitHook.x?r=repoName

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

Эта команда curl сообщила моему серверу, что нужно сделать код. Все, что было необходимо для обработки в php, было:

<?
$r = $_GET['r'];
if (!empty($c)) {
    //use system instead of exec if you want the output to go back to the git client
    exec("cd /path/to/repo/parent/$r; sudo git reset --hard HEAD; sudo git pull;");
    echo "\n\nServer: Updated\n\n";
} else {
    echo "\n\nServer: UPDATE FAILED\n\n";
}
?>

Единственная проблема с тем, что он должен был запускаться пользователем root вместо пользователя apache, поэтому мне также пришлось сделать файл в /etc/sudoers.d/, содержащий:

www-data ALL = NOPASSWD: /usr/bin/git

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

Ответ 6

#!/bin/bash
git commit -a -m "autoupdate `date +%F-%T`"
git push

автоматическое форматирование с текущей датой и временем.

Ответ 7

Я написал программу GitPrime для автоматического сохранения ваших локальных репозиториев Git. Теперь легко откатиться до того, как вы его разорили! Хранилище битбакетов

Это должно работать на любой платформе, которая поддерживает оболочку bash, включая Windows + Cygwin.

Ответ 8

Inotify действительно звучит как правильный инструмент для работы.

Существует инструмент под названием incron, который может быть именно тем, что вы ищете. Вы можете указать файлы или папки (и типы событий, такие как "change", "create", "unlink" ) в чем-то вроде crontab и команду для запуска при возникновении такого события.

В отличие от inotifywait (который был бы аналогом бедного человека cron sleep 10;do stuff), это поймает каждое событие, а не только первое.

Я не использовал его сам, но из документации он не выглядит слишком сложным для настройки.

Ответ 9

Если кто-то попытается сделать это из Powershell, я имел успех, используя следующее:

& "C:\Program Files (x86)\Git\bin\sh.exe" -c "cd D:\PATH\TO\REPO && git add --all  &&  git commit -m 'Automatic Commit Message Goes Here' && git push origin master"

Ответ 11

Если вы знаете имя файла и хотите контролировать только один (или несколько файлов), вы можете просто вызвать "git commit" каждые несколько минут, чтобы достичь этого. Если файл не изменился, git будет просто жаловаться, и вам придется проигнорировать эту ошибку, но кроме этого, не будет никакого повреждения.

В дополнение к этому вы захотите пометить эти файлы как "auto commit", чтобы иметь возможность совершать вручную. Таким образом, пользователь может видеть автоматические изменения, а также более крупные "логические" изменения, которые сопровождаются комментариями коммита, чтобы объяснить, что изменилось с момента последней фиксации вручную.

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

Другой вариант - использовать команды git low-level для создания собственного специализированного репозитория.

Наконец, вы можете скопировать файл в новое имя ( "$ filename.ac" ), делая автоматические фиксации, чтобы различать ручную и автоматическую версии.

Ответ 12

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

Ответ 13

Похоже, вы ищете нечто похожее на etckeeper, которое предназначено для автоматической проверки всех ваших изменений на /etc/ * в git (или любой другой VCS, который вы хотите), но я не вижу причин, по которым он не может использоваться с файлами, отличными от файлов в /etc.

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

Ответ 14

Этот script не запускается, когда пользователь меняет файл, но его можно запустить как задание cron (отбросив его в каталог /etc/cron.*), что также является разумным решением.

Этот script будет перебирать ваш каталог /srv/www (изменить его везде, где хранятся все ваши сайты), добавлять, фиксировать и выталкивать все файлы и записывать все в /var/log/gitlog.txt

now=$(date +"%m.%d.%Y_%T")
logfile='/var/log/gitlog.txt'

for dir in /srv/www/*/
do
echo -e '\n' >> $logfile
echo "autocommit $dir $now" >> $logfile
echo "--------------------------" >> $logfile

cd $dir
git add . >> $logfile
git commit -am "autocommit $now" >> $logfile
git push origin master >> $logfile
done

Ответ 15

У меня была та же проблема, и на mac launchd вы получите отличное решение. он будет смотреть файл или каталог, и если есть изменения, вы можете запустить приложение или что-то еще...

Ответ 17

Если вы не хотите путаться с кодами и командами Linux, то я хотел бы предложить вам использовать Dropbox для кодирования. Я обнаружил, что Dropbox отлично подходит для кодирования. Я просто установил dropbox на свой компьютер и создал виртуальный хост. Виртуальный хост указывает на мою папку Dropbox. Всякий раз, когда я делаю изменения в любом файле и нажимаю CTRL + S (то есть, сохраняю), он создает новую версию файла. Я просто обожаю эту технологию, здесь есть преимущество использования Dropbox для кодирования.

  • Экономия времени: - Больше нет Push and Pull для товарищей по команде. Вы можете сэкономить свое время, если вы раздражаете, нажимая и вытягивая коды снова и снова.
  • Прекрасно, если вы работаете с группой разработчиков, если вы установили Dropbox на каждом компьютере разработчика, тогда работайте с одной и той же папкой, если есть конфликт, он автоматически создаст конфликтующий файл.
  • если вы случайно удалили какой-либо файл, вы можете восстановить его из облачного хранилища.
  • Контроль версий при каждом сохранении.

наконец я не промоутер Dropbox.