使git自动提交

使git自动提交,git,Git,我想使用git来记录对文件的所有更改 有没有一种方法可以让git“提交”在每次文件更新时自动发生?这样,对文件的每次更改都会有一个新的提交 理想情况下,我希望我的用户甚至不知道git正在幕后运行。然后,用户可以潜在地“撤消”对文件的更改,这可以通过从git中提取以前的版本来实现。我敢肯定,您需要将其挂接到用户正在使用的任何编辑器中。您可以编写一些内容来轮询更改,但这取决于使用模式,轮询频率可能需要非常高,以确保它拾取的是单个更改而不是多个更改。在Linux上,您可以使用inotifywait在每

我想使用git来记录对文件的所有更改

有没有一种方法可以让git“提交”在每次文件更新时自动发生?这样,对文件的每次更改都会有一个新的提交


理想情况下,我希望我的用户甚至不知道git正在幕后运行。然后,用户可以潜在地“撤消”对文件的更改,这可以通过从git中提取以前的版本来实现。

我敢肯定,您需要将其挂接到用户正在使用的任何编辑器中。您可以编写一些内容来轮询更改,但这取决于使用模式,轮询频率可能需要非常高,以确保它拾取的是单个更改而不是多个更改。

在Linux上,您可以使用inotifywait在每次更改文件内容时自动执行命令

编辑:以下命令在保存file.txt后立即提交:

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

如果您知道文件名,并且只想监视一个(或几个)文件,那么只需每隔几分钟调用“git commit”即可实现这一点。如果文件没有更改,git只会抱怨,您必须忽略此错误,但除此之外,不会出现任何损坏

除此之外,您还需要将这些文件标记为“自动提交”,以便能够手动提交。通过这种方式,用户可以看到自动更改以及更大的“逻辑”更改,这些更改伴随着提交注释,以解释自上次手动提交以来发生的更改

例如,使用“自动提交”作为提交消息。稍后,您可以编写一个工具,使用git日志清除这些提交(以找出要终止的修订),或者尝试使用蛮力冲突解决策略创建分支自动提交,以敲入“手动提交”

另一种选择是使用git低级命令来构建自己的专用存储库


最后,您可以在执行自动提交时将文件复制到一个新名称($filename.ac),以区分手动版本和自动版本。

前面的inotifywait答案很好,但它不是一个完整的解决方案。如前所述,它是对文件中的一次性更改的一次性提交。它不适用于编辑文件创建具有原始名称的新inode的常见情况inotifywait-m显然是按照inode而不是名称来跟踪文件的。此外,文件更改后,如果没有git addgit commit-a,则不会为git commit暂存文件。进行一些调整后,我将在Debian上使用以下内容来跟踪日历文件的所有更改:

/etc/rc.local:


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


这可以概括为等待文件和/或目录列表,以及相应的inotifywait进程,并在文件更改时重新启动每个inotifywait

我也遇到了同样的问题,mac launchd为您提供了一个很好的解决方案。 它将监视一个文件或目录,如果有更改,您可以运行一个应用程序或其他任何东西。

是一个很好的解决方案,对我来说效果很好。 “WIP”代表“正在进行的工作”。每次运行“git-wip”时,更改都会提交到一个单独的分支。它可以在命令行上运行,但vim和emacs有一些扩展,可以在每次写入文件时自动运行git wip。

我编写了一个程序,为本地git存储库提供自动保存功能。现在很容易在你破坏它之前回滚到它

这应该适用于任何支持bashshell的平台,包括Windows+Cygwin

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

自动推送当前日期和时间。

Inotify听起来确实是适合这项工作的工具

有一个叫做的工具,它可能正是您所寻找的。您可以在crontab中指定文件或文件夹(以及事件类型,如“更改”、“创建”、“取消链接”),以及在发生此类事件时要运行的命令

与inotifywait(类似于穷人的cron
sleep 10;do stuff
)不同,它将捕捉每一个事件,而不仅仅是第一个事件


我自己没有用过,但从文档来看,它看起来并不太复杂,无法设置。

之前的答案建议我使用inotifywait来完成这项工作,当我自己遇到这个问题时,给我提供了正确的方向,所以我写了一个小脚本。首先,这只能递归地查看整个文件夹(与Lester Buck的示例相反),但是我还想查看其他地方的文件,所以我扩展了它

结果是一个脚本,当前称为
gitwatch
,它就是这样做的:它监视文件或文件夹的更改(使用inotifywait),并将其提交到git存储库


您可以在github上找到脚本、更多信息和说明:

我想在windows中执行此操作,发现最好的方法是使用检查更改,然后在检测到更改时运行:

程序:cmd.exe

参数:/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**”
),但我认为我无法正常工作

我还制作了一个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
www-data ALL = NOPASSWD: /usr/bin/git
(如果有任何冲突,那么它将中止拉和推,但没有任何明确的方式来说明发生了什么-最终,我们放弃了整个想法,因为这一个缺陷。)

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";
}
?>

对我来说,我认为这非常有效。目录监视器可以配置为在启动时运行并最小化启动,它可以查看多个不同的文件夹

听起来像是您在寻找类似的东西,它是自动设计的
www-data ALL = NOPASSWD: /usr/bin/git
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
& "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"
mkdir /foo
etckeeper -d /foo init`
etckeeper -d /foo commit 'message'

# 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
git add -u
git commit -m "your commit message"
git push origin master