当前位置:  开发笔记 > 编程语言 > 正文

制作git自动提交

如何解决《制作git自动提交》经验,为你挑选了9个好方法。

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

有没有一种方法可以让git'commit'on在每次更新文件时自动发生 - 所以对文件的每次更改都有一个新的提交?

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



1> JesperE..:

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

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

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


在Windows中有任何选项..?
您如何才能对整个文件夹(不仅仅是一个文件)执行此操作?
使用-r标志来实现inotifywait,但是请注意,内核对它可以设置的inotifywait监视数量有限制。man inotifywait将告诉您更多信息。

2> 小智..:

早期的inotifywait答案很棒,但它不是一个完整的解决方案.如上所述,它是一次性提交文件中的一次性更改.它不适用于编辑文件创建具有原始名称的新inode的常见情况. inotifywait -m显然遵循inode文件,而不是名称.此外,在文件更改后,如果没有git addgit commit -a,则不会为git commit 暂存.做一些调整,这是我在Debian上用来跟踪我的日历文件的所有更改:

/etc/rc.local中:

su -c /home//bin/gitwait -l 

的/ 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.


莱斯特可以请你扩展如何将其推广到一个目录?

3> Nevik Rehnel..:

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

结果是当前调用的脚本gitwatch,就像它所做的那样:它监视文件或文件夹以进行更改(使用inotifywait),并将它们提交到git存储库.

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


有用的小脚本.我会记下它.

4> rafak..:

git-wip是一个很好的解决方案,适合我."WIP"代表"正在进行中的工作".每次运行'git wip'时,更改都会被提交到一个单独的分支.它可以在命令行上运行,但是vim和emacs的扩展可以在每次写入文件时自动运行git-wip.



5> Redzarf..:

我想在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 *.*"),但我认为我没有正常工作.

我还做了一个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中处理它所需要的只是:


唯一的问题是它需要由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> Brendan..:

我编写了一个程序GitPrime,为您当地的Git存储库提供自动保存.现在很容易在你破坏它之前回滚!Bitbucket存储库.

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



8> pixelbrei..:

Inotify真的听起来像是工作的正确工具.

有一个名为incron的工具可能正是您正在寻找的.您可以在类似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"


这是如何自动触发的?
预定任务?
推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有