代码之家  ›  专栏  ›  技术社区  ›  Ian Terrell

Git钩子可以自动将文件添加到提交中吗?

  •  51
  • Ian Terrell  · 技术社区  · 16 年前

    我想使用Git中的pre-commit或post-commit钩子将自动生成的文件添加到同一个提交中,具体取决于在该提交中修改的文件。我该怎么办?

    我尝试过将此作为预提交挂钩,但没有成功:

    #!/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
    

    这将成功地将它们添加到存储库中,但不会将它们添加到提交中。我还尝试过在提交后钩子中使用最后两行exec代码以及提交前检查,但也没有效果。

    10 回复  |  直到 15 年前
        1
  •  60
  •   Martin Schneider    6 年前

    由于git add在预提交中也不适用于我,所以我遵循mark的想法,使用.commit文件并将过程分为预提交和后提交。

    下面是一些应该容易理解的代码

    在预提交中:

    #!/bin/sh 
    echo 
    touch .commit 
    exit
    

    在提交后:

    如果.commit存在,则您知道刚刚发生了一次提交,但 此外,测试.commit,如果它存在:

    • commit--amend-C HEAD--no-verify(避免循环)
    • 删除.提交文件
    #!/bin/sh
    echo
    if [ -e .commit ]
        then
        rm .commit
        git add yourfile
        git commit --amend -C HEAD --no-verify
    fi
    exit
    

        2
  •  35
  •   Jim Garvin    15 年前

    使用预提交钩子可以完成您想要的操作。我们为heroku部署做了类似的事情(将coffeescript编译为javascript)。脚本无法运行的原因是您使用了 exec 指挥不当。

    从 man page :

    只有第一个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
    
        3
  •  14
  •   calimarkus    13 年前
    #!/bin/sh
    #
    #  .git/hooks/pre-commit
    #
    
    git add file.xyz
    

    这对我来说很好。 它将是当前提交的一部分。

    git version 1.7.12.4 (Apple Git-37)

        4
  •  10
  •   Mark    14 年前

    在预提交中:

    • 触摸一个文件,提交或者其他什么。(请确保将其添加到.gitignore)

    在提交后:

    • 添加文件
    • 删除.提交文件

    如果有人知道一个更好的方法,我洗耳恭听,但它似乎现在起作用。

        5
  •  9
  •   rfunduk    10 年前

    update-index :

    git update-index --add my_files

        6
  •  2
  •   Craig Trader    16 年前

    如果文件是自动生成的,并且可以在任何地方生成(隐含在您希望在Git pre-commit钩子中构建它们的愿望中),那么您首先就不应该将它们置于源代码控制之下。您应该只控制源文件——生成的文件应该作为构建脚本的一部分生成。

    补充

    从…起 http://git-scm.com/docs/githooks :

    预提交 提交,并且可以通过 --没有验证选项。它不接受任何参数,并且在之前被调用 消息并进行提交。退出 此脚本的状态为非零

    默认的预提交挂钩,当 已启用,捕捉线的引入 带有尾随空格和中止 找到这样一行时的提交。

    所有git提交钩子都被调用 使用环境变量 GIT_EDITOR=:如果命令 打开一个编辑器来修改

    预提交钩子的目的是在进行提交之前,对工作区的状态和提交的内容进行通过-失败检查。尝试更改提交的内容无效。

        7
  •  2
  •   rfunduk    16 年前

    写封信怎么样 post-commit 改为使用脚本生成文件,然后 那个 git add my_files; git commit --amend .

        8
  •  1
  •   Hassek    14 年前

    我也有同样的需求,这种方法对我来说非常有效:

    #!/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
    

    其中“创建我的文件”应该是可执行的,例如,如果它是python文件,您可以将其作为“python创建我的文件和git添加我的文件”执行

    确实,您不需要预先提交就可以再次提交(这将创建一个无限讨厌的循环:p)

        9
  •  1
  •   Evandro Coan    9 年前

    在这里你可以发现问题已经解决了。在这里,它在每次提交时更新文件版本,添加一个新的修改文件,并根据需要修改提交。它正在充分发挥作用: https://github.com/evandrocoan/.versioning

    然后,您只需将文件“updateVersion.sh”上的“Version File Replacement”算法替换为您的算法。也许您需要更改一些内容,例如,删除分支限制,因为只有在“开发”分支上,脚本才会运行。

    此外,它只会在暂存时更改指定的文件。如果文件没有暂存,那么它只会执行正常/常规提交。更准确地说,它会打印出每一步所做的事情。

    我要解释一下,那个把戏。这相当棘手。在PrepareCommitMsg钩子上,它检测所需文件是否正在暂存和提交。之后,它创建一个标志文件,并停止prepare-commit-msg钩子。 稍后在post-commit钩子上,它检查标志文件是否存在。如果是,它将修改提交上的文件。

        10
  •  -2
  •   Danh    9 年前

    在预提交钩子中,我也面临同样的问题。我修改了一个文件并提交了它,但它采用了以前的文件而不是更新的文件,所以通过在预提交钩子中添加git命令(如下所示),它解决了这个问题。

    git add $file
    

    注: $file 是要添加的文件。