我想使用git将所有更改记录到文件中。
有没有办法可以在每次文件更新时自动启用git'commit'-因此对文件的每次更改都有一个新的提交?
理想情况下,我希望用户甚至不知道git在后台运行。然后,用户可以潜在地“撤消”对文件的更改-这可以通过从git中拉出以前的版本来实现。
我想使用git将所有更改记录到文件中。
有没有办法可以在每次文件更新时自动启用git'commit'-因此对文件的每次更改都有一个新的提交?
理想情况下,我希望用户甚至不知道git在后台运行。然后,用户可以潜在地“撤消”对文件的更改-这可以通过从git中拉出以前的版本来实现。
Answers:
在Linux上,您可以在每次更改文件内容时使用inotifywait自动执行命令。
编辑:以下命令在保存后立即提交file.txt:
inotifywait -q -m -e CLOSE_WRITE --format="git commit -m 'autocommit on change' %w" file.txt | sh
-r标志使用到inotifywait,但是请注意,内核对它可以设置的inotifywait监视数有限制。man inotifywait会告诉你更多。
较早的inotifywait答案很好,但是它不是一个完整的解决方案。如所写,这是一次更改文件的一次提交。在编辑文件会创建具有原始名称的新inode的常见情况下,它不起作用。 inotifywait -m显然是按索引节点而不是名称跟随文件。另外,文件更改后,它不是上演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。
先前的答案建议使用inotifywait当我自己遇到此问题时我朝正确的方向前进,所以我写了一个小脚本。首先,它只能以递归方式监视整个文件夹(与Lester Buck的示例相反),然后我还想在其他地方监视文件,因此我对其进行了扩展。
结果是当前调用的脚本gitwatch,其工作方式是这样:它监视文件或文件夹中的更改(使用inotifywait),并将其提交到git存储库。
您可以在github上找到脚本,更多信息和说明: https //github.com/nevik/gitwatch
我想在Windows中执行此操作,发现最好的方法是使用Directory Monitor检查更改,然后在检测到更改时运行它:
程式:cmd.exe
参数:/CC:\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
对于我来说,我认为这非常有效。目录监视器可以配置为在启动时运行并最小化启动,它可以监视几个不同的文件夹
我编写了一个程序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"
有两种解决方案,我想是etckeeper -它可以适应自定义目录以外/etc:
mkdir /foo
etckeeper -d /foo init`
etckeeper -d /foo commit 'message'
和gitwatch-特别是有关如何与一起使用supervisord的说明。
如果您知道文件名,并且只想监视一个(或几个文件),则只需每隔几分钟调用“ git commit”即可实现。如果文件没有更改,git只会抱怨,您将不得不忽略此错误,但除此之外,不会损坏。
除此之外,您还希望将这些文件标记为“自动提交”,以便也能够手动提交。这样,用户可以看到自动更改以及较大的“逻辑”更改,这些更改带有提交注释,以解释自上次手动提交以来已发生的更改。
例如,使用“ AUTOCOMMIT”作为提交消息。以后,您可以编写一个工具来使用git log清除这些提交(以找出要删除的修订),也可以尝试使用蛮力冲突解决策略创建分支AUTOCOMMIT来敲入“手动提交”。
另一个选择是使用git低级命令来构建自己的专用存储库。
最后,您可以在进行自动提交时将文件复制到新名称(“ $ filename.ac”),以区分手动版本和自动版本。
听起来您正在寻找类似于etckeeper的东西,它旨在自动将对 / etc / *的所有更改都检查到git(或您想要的任何VCS)中,但我看不出它不能与文件一起使用除了/ etc中的那些。
如果只想处理一个文件,那可能就不完美了,但是如果要跟踪给定目录中的所有内容,我认为值得检查一下。
当用户更改文件时,该脚本不会运行,但可以作为cron作业(通过将其放入/etc/cron.*目录中)运行,这也是一个合理的解决方案。
该脚本将遍历您的/ 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
我制作了这个小巧的Shell脚本来监视文件状态并在构建成功时触发命令git commit。
随时下载并尝试。
https://github.com/nzvincent/nzvincent-github/blob/master/inotify-tools/inotify.sh
这不能满足问题的“理想”部分,但这是我所看到的最接近我想要的答案的问题,因此我认为可以在此处进行。我的第一个stackoverflow帖子虽然如此,如果我弄错了,所以深表歉意。
以下脚本可确保对保存的更改进行自动提交,但会提示用户输入提交。(我意识到我的情况与git-noob的情况有些不同)。
# While running, monitors the specified directory, and when a file therein
# is created or edited and saved, this prompts the user for a commit message.
# The --exclude is to avoid extra prompts for the changes made to
# version control directories.
# requires inotify-tools
inotifywait --exclude '/\..+' -m path/to/directory -e modify -e create |
while read path action file; do
gnome-terminal -e 'bash -c "cd path/to/directory;
git add *;
echo What did you just do??;
read varname;
git commit -m \"$varname\""'
done