让git自动提交
我想用git来logging文件的所有更改。
有没有一种方法可以把git'commit'变成每次更新文件时自动发生的 – 所以每次文件更改都有一个新的提交?
理想情况下,我希望我的用户甚至不知道git正在幕后运行。 然后用户可能会“撤消”对文件的更改 – 这可以通过从git中提取以前的版本来实现。
在Linux上,您可以使用inotifywait在每次更改文件内容时自动执行命令。
编辑:下面的命令保存后立即提交file.txt:
inotifywait -q -m -e CLOSE_WRITE --format="git commit -m 'autocommit on change' %w" file.txt | sh
较早的inotifywait答案是伟大的,但它不是一个完整的解决scheme。 正如所写的,它是在文件中一次性更改的一次性提交。 它不适用于编辑文件时使用原始名称创build新的inode的常见情况。 inotifywait -m显然是按照inode而不是按名称的文件。 此外,文件更改后,它不会没有git提交没有git提交或git提交-a 。 进行一些调整,这里是我在Debian上用来跟踪日历文件的所有更改:
/etc/rc.local中:
su -c /home/<username>/bin/gitwait -l <username>
的/ home / <用户名> / bin中/ 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 。
以前的回答是,当我自己遇到这个问题的时候,推荐这个工作的时候,我写了一个小小的脚本。 首先,这只能recursion地看整个文件夹(与Lester Buck的例子相反),但是我也想在其他地方看一个文件,所以我扩展了它。
结果是一个当前叫做gitwatch
的脚本 ,就是这么做的:它监视文件或文件夹的变化(使用inotifywait),并将它们提交给一个git仓库。
你可以在github上find脚本,更多信息和说明: https : //github.com/nevik/gitwatch
git-wip是一个很好的解决scheme,适合我。 “WIP”代表“正在进行中”。 每次运行“git wip”时,都会将这些更改提交给一个单独的分支。 它可以在命令行上运行,但是有vim和emacs的扩展可以在每次写入文件时自动运行git-wip。
我想在Windows中这样做,并发现最好的方法是使用目录监视器检查更改,然后当它检测到更改运行:
程序:cmd.exe
Params:/CC:\pathToBatchFile.bat
该batch file包含:
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 *.*"
),但我不认为我得到了正常工作。
我也做了一个post-commit钩子,其中包含:
#!/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/
中创build一个包含以下内容的文件:
www-data ALL = NOPASSWD: /usr/bin/git
对我来说,我觉得这个工作非常扎实。 目录监视器可以configuration为在启动时运行,并开始最小化,并可以看几个不同的文件夹
#!/bin/bash git commit -a -m "autoupdate `date +%F-%T`" git push
自动按现在的date和时间。
Inotify真的听起来像是这个工作的正确工具。
有一个叫incron的工具,可能正是你要找的。 您可以指定crontab之类的文件或文件夹(以及事件types,如“更改”,“创build”,“取消链接”),以及发生此类事件时运行的命令。
与inotifywait(这可能是穷人的cron sleep 10;do stuff
的模拟sleep 10;do stuff
)相反,这将抓住每一个事件,而不仅仅是第一个。
我自己并没有使用它,但从文档来看,它看起来不太复杂。
我编写了一个程序GitPrime ,为您的本地Git存储库提供自动保存。 现在很容易回滚到你之前! Bitbucket存储库 。
这应该在任何支持bash shell(包括Windows + Cygwin)的平台上工作。
如果有人试图从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"
如果您知道文件的名称,并且只想监视一个(或几个文件),则可以每隔几分钟调用一次“git commit”来实现此目的。 如果该文件没有改变,git只会抱怨,你将不得不忽略这个错误,但除此之外,将不会有腐败。
除此之外,您还需要将这些文件标记为“自动提交”,以便能够手动提交。 通过这种方式,用户可以看到自动更改以及更大的“逻辑”更改,这些更改伴随着提交注释,以解释自上次手动提交以来发生的更改。
例如,使用“AUTOCOMMIT”作为提交消息。 后来,你可以使用git log来编写一个工具来清除这些提交(找出要修改的文件),或者你可以尝试使用暴力冲突解决策略来创build一个分支AUTOCOMMIT,以便在“手动提交”中敲击。
另一种select是使用git的低级命令来build立你自己的专门的存储库。
最后,你可以复制文件到一个新的名字(“$ filename.ac”)做自动提交区分手动版本和自动版本。
我很确定你需要把它钩入你的用户使用的任何编辑器。 您可以编写一些内容来轮询更改,但根据使用模式的不同,轮询频率可能需要非常高才能确保它正在收集单个更改,而不是多次更改。
我有同样的问题,并在Mac推出为您提供了一个很好的解决scheme。 它会观看一个文件或目录,如果有变化,你可以运行一个应用程序或其他任何…
这听起来像你正在寻找类似于etckeeper的东西,它被devise为自动检查你所有的变化到/ etc / *到git(或任何你想要的VCS),但我看不出有什么理由不能用于文件除了那些在/ etc。
如果你只想处理一个单一的文件,也许这不是完美的,但如果你想跟踪给定目录中的所有内容,我认为这是值得的。
当用户更改文件时,此脚本不运行,但可以作为cron作业(通过将其放到/etc/cron.*目录中)运行,这也是一个合理的解决scheme。
这个脚本将遍历/ srv / www目录(将其更改为所有站点的存储位置),添加,提交和推送所有文件,并将所有内容logging到/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
我喜欢的两个解决scheme是etckeeper–它可以适应除/etc
之外的自定义目录 :
mkdir /foo etckeeper -d /foo init` etckeeper -d /foo commit 'message'
和gitwatch – 特别是如何使用supervisord
它的指示。