Git钩子能否自动添加文件到提交?
我想使用Git中的提交前或提交后钩子,将自动生成的文件添加到相同的提交中,具体取决于在提交中修改的文件。 我将如何去做这件事?
我已经试过这个作为预先提交的钩子,但没有运气:
#!/bin/sh files=`git diff --cached --name-status` re="<files of importance>" if [[ $files =~ $re ]] then echo "Creating files" exec bundle exec create_my_files exec git add my_files exec git commit --amend -C HEAD fi
这成功地将它们添加到存储库,但不会将它们添加到提交。 我也试过在post-commit hook和pre-commit检查中使用最后两个exec行,但是也不行。
可以使用预先提交的钩子来做你想做的事情。 我们做一些类似的heroku部署(编译coffeescript JavaScript)。 你的脚本不工作的原因是你不正确地使用了exec
命令。
从手册页 :
exec内build函数用于用新命令replace当前正在运行的shell进程映像。 成功完成后,exec永远不会返回。 exec不能在pipe道中使用。
只有你的第一个exec命令正在运行。 之后,你的脚本基本上被终止。
给这样的事情一个尝试(作为预先提交钩子):
#!/bin/sh files=`git diff --cached --name-status` re="<files of importance>" if [[ $files =~ $re ]] then echo "Creating files" bundle exec create_my_files git add my_files fi
由于git add在预先提交时也不适合我,所以我遵循mark的使用.commit文件的想法,并将进程分成前后提交。
这里是一些应该很容易理解的代码
在预先提交:
- 触摸文件.commit或其他东西。 (一定要添加到.gitignore)
#!/bin/sh echo touch .commit exit
在提交后:
如果.commit存在,你知道一个提交已经发生,但后提交尚未运行。 所以,你可以在这里做你的代码生成。 此外,testing.commit,如果它存在:
- 添加文件
- commit –amend -C HEAD – 无validation(避免循环)
- 删除.commit文件
#!/bin/sh echo if [ -a .commit ] then rm .commit git add yourfile git commit --amend -C HEAD --no-verify fi exit
希望这能让那些没有几分知识的人更容易遵循mark的想法。
您可以使用提交前和提交后脚本的组合。
在预先提交:
- 触摸文件.commit或其他东西。 (一定要添加到.gitignore)
在提交后:
如果.commit存在,你知道一个提交已经发生,但后提交尚未运行。 所以,你可以在这里做你的代码生成。 此外,testing.commit,如果它存在:
- 添加文件
- 提交 – 修正-C HEAD – 不validation(避免循环)
- 删除.commit文件
这大致是我用来将元数据文件存储在从Metastore生成的存储库中的过程。
如果有人知道一个更好的方式,我全部耳朵,但它似乎现在工作。
#!/bin/sh # # .git/hooks/pre-commit # git add file.xyz
这对我来说工作得很好。 这将是当前提交的一部分。
git version 1.7.12.4 (Apple Git-37)
如何编写一个post-commit
脚本,而不是生成你的文件,然后有做(沿线的东西) git add my_files; git commit --amend
git add my_files; git commit --amend
。
你可以使用update-index
:
git update-index --add my_files
如果这些文件是自动生成的,并且它们可以在任何地方生成(隐含在你希望在Git pre-commit钩子中构build它们),那么你不应该把它们置于源代码控制之下。 您只应该控制源文件 – 生成的文件应作为构build脚本的一部分生成。
将生成的文件放在源代码pipe理下的唯一原因是需要生成唯一/特权资源(如许可程序),或者需要大量时间才能生成。
添加
从http://git-scm.com/docs/githooks :
pre-commit这个钩子是由git commit调用的,可以用–no-verify选项绕过。 它不接受任何参数,并在获得build议的提交日志消息并进行提交之前被调用。 从此脚本退出非零状态会导致git提交中止。
默认的预提交钩子在启用时捕获带有尾随空格的行的引入,并在find这样的行时中止提交。
所有的git commit钩子都会被环境variablesGIT_EDITOR =调用,如果这个命令不会调用编辑器来修改提交信息的话。
预提交钩子的目的是在提交之前对工作空间的状态和提交的内容进行通过失败检查。 试图改变提交的内容将无法正常工作。
我的build议是将两个步骤添加到您的构build脚本中:(1)构build所有需要生成的过时文件(并将其添加到工作区)的步骤;以及(2)将检查以确保所有生成的文件是最新的,并返回一个非零的状态码。 你的Git预提交钩子应该运行第二步。 您的开发人员应接受培训,以根据需要运行第一步。
我有同样的需求,这种方法对我来说很好:
#!/bin/sh files='git diff --cached --name-only' re="<files of importance>" if [[ $files =~ $re ]] then echo "Creating files" create_my_files && git add my_files fi
其中“create_my_files”应该是可执行的,例如,如果它是一个Python文件,你可以执行它“python create_my_files && git add my_files”
是真的,你不需要预先承诺再次提交(这将创build一个无限的讨厌的循环:P)
是的,你可以添加生成的文件自动提交使用git钩子! 但它需要一个棘手的脚本。
在这里你可以find解决的问题。 在那里,它是每次提交更新文件版本,添加一个新的修改文件,并修改提交,因为你需要它。 它完全正常工作: https : //github.com/evandrocoan/.versioning
然后,您只需使用您的algorithmreplace文件“updateVersion.sh”上的“版本文件replace”algorithm即可。 也许你需要改变一些东西,删除分支的限制,因为在那里,脚本只运行,如果你在'发展'分支。
而且,它只会改变指定的文件,如果是上演的话。 如果该文件没有被暂存,那么它将不会执行正常/通常的提交。 更准确地说,它打印出每一步所做的事情。
我将解释,那个诡计。 这是相当棘手的。 在prepare-commit-msg-hook上,它检测是否正在执行和提交所需的文件。 之后,它会创build一个标志文件,并停止prepare-commit-msg-hook。 稍后在提交后挂钩,它检查标志文件是否存在。 如果是,则修改提交的文件。
注意,它会创build一个无限循环,因为它会再次调用prepare-commit-msg-hook(就像我们正在修改的那样)。 但是这并不是因为国旗文件而发生的。 当prepare-commit-msg-hook运行并find标志文件时,它会“知道”发生了什么。 然后只是删除标志文件,不要再创build它。 这样做,它会阻止提交后的钩子再次修改提交,允许提交完成。
我也面临同样的问题。 我正在修改一个文件,并提交,但它是以前的文件没有更新的文件,所以通过在预先提交钩子添加git命令(如下),它解决了。
git add $file
注意: $file
是您要添加的文件。
谢谢,