使git自动提交


155

我想使用git将所有更改记录到文件中。

有没有办法可以在每次文件更新时自动启用git'commit'-因此对文件的每次更改都有一个新的提交?

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


9
使用版本控制文件系统会更容易:en.wikipedia.org/wiki/Versioning_file_system
William Pursell,2012年

1
SparkleShare在这方面令人印象深刻。
theode

SparkleShare看起来是一个不错的选择,但它会破坏主git中的所有.git文件夹
签名

您可以使用github.com/jw0k/gwatch。它适用于Windows和Linux。
rubix_addict

@rubix_addict您为什么不将其发布为答案?
Tobias Kienzler

Answers:


127

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

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

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

2
您如何使其针对整个文件夹(而不是单个文件)执行此操作
Anderson Green

2
-r标志使用到inotifywait,但是请注意,内核对它可以设置的inotifywait监视数有限制。man inotifywait会告诉你更多。
JesperE 2012年

14
Windows中有任何选项吗?
Chandan Pasunoori 2013年

50

较早的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


8
Lester能否请您扩展一下如何将其概括为目录?
迭戈2010年

29

先前的答案建议使用inotifywait当我自己遇到此问题时我朝正确的方向前进,所以我写了一个小脚本。首先,它只能以递归方式监视整个文件夹(与Lester Buck的示例相反),然后我还想在其他地方监视文件,因此我对其进行了扩展。

结果是当前调用的脚本gitwatch,其工作方式是这样:它监视文件或文件夹中的更改(使用inotifywait),并将其提交到git存储库。

您可以在github上找到脚本,更多信息和说明: https //github.com/nevik/gitwatch


4
有用的小脚本。我会记录下来。
iwein 2012年

有趣的地方可能对magento网站有用。我正在测试它,但似乎也无法使其自动推动
NoSixties

16

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


12

我想在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

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


同样在Windows上,我无法让git在LocalSystem下运行,因此,如果您创建自己的监视服务,则必须在可以实际运行Git的用户下运行它。可能我只是缺少一些设置/配置,但无论如何还是要设置一个新的git commit帐户更好
Whelkaholism

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

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


8

Inotify听起来确实像是正确的工作工具。

有一个名为incron的工具,可能正是您要寻找的工具。您可以在crontab之类的文件中指定文件或文件夹(以及事件类型,例如“ change”,“ create”,“ unlink”),并指定在此类事件发生时运行的命令。

与inotifywait(这类似于穷人的cron sleep 10;do stuff)相反,它将捕获所有事件,而不仅仅是第一个事件。

我自己还没有使用过它,但是从文档上看,它的安装似乎并不太复杂。


7

我编写了一个程序GitPrime,为您本地的Git存储库提供自动保存功能。现在,您可以轻松地回滚到破坏之前!Bitbucket存储库

这应该可以在支持bash shell的任何平台上使用,包括Windows + Cygwin。


+1我在Windows(CygWin)上使用它来自动保存我使用计划任务每​​10分钟对git-tf存储库所做的更改
Darbio 2013年

6

万一有人尝试从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"

5
以及这是如何自动触发的?
jerik 2014年

2
预定任务?
ozzy432836 '16


2

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

除此之外,您还希望将这些文件标记为“自动提交”,以便也能够手动提交。这样,用户可以看到自动更改以及较大的“逻辑”更改,这些更改带有提交注释,以解释自上次手动提交以来已发生的更改。

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

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

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


1

我很确定您需要将其挂接到用户正在使用的任何编辑器中。您可以编写一些东西来轮询更改,但是根据使用模式,轮询频率可能需要非常高,以确保它获取的是单个更改而不是多个更改。


另外,轮询更改将创建竞争条件。
孟买

1
不适用于emacs和yi这样的编辑器,后者以“事务方式”写入文件以尝试确保崩溃后数据不会丢失。
罗宾·格林

1

听起来您正在寻找类似于etckeeper的东西,它旨在自动将对 / etc / *的所有更改都检查到git(或您想要的任何VCS)中,但我看不出它不能与文件一起使用除了/ etc中的那些。

如果只想处理一个文件,那可能就不完美了,但是如果要跟踪给定目录中的所有内容,我认为值得检查一下。


1

当用户更改文件时,该脚本不会运行,但可以作为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



0

这不能满足问题的“理想”部分,但这是我所看到的最接近我想要的答案的问题,因此我认为可以在此处进行。我的第一个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

0

对于Windows

根据有关自动提交的这篇文章,您应该创建.bat包含内容的文件:

git add -u
git commit -m "your commit message"
git push origin master 

并执行Task Scheduler。如果您不知道如何逐步进行操作,请参阅该文章。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.