pre-commit hook不会检查保存的更改是否在运行之前暂存

时间:2013-08-08 19:06:45

标签: git bash githooks pre-commit

我跟着this guide on creating git pre-commit hooks,到目前为止我真的很喜欢给我的好处。

但是,我使用它时遇到问题:

  1. 我写了一些代码,也许是一些没有通过rubocop检查的代码。
  2. 我暂存它,然后尝试提交它。预提交钩子按预期工作。
  3. 我去解决rubocop报道的问题。
  4. 我保存了更改,但忘了add它到索引
  5. 当我提交时,我的脚本只获取git diff --cached --name-only --diff-filter=AM中更改的文件列表,在每个文件上运行rubocop,并在出现任何问题时退出。

    这是我的剧本:

    #!/bin/sh
    
    # Set the ruby environment from local/rvm, depending on your machine.
    # http://stackoverflow.com/questions/17515769
    if [ -d "$HOME/.rvm/bin" ]; then
      PATH="$HOME/.rvm/bin:$PATH"
      [[ -s "$HOME/.rvm/scripts/rvm" ]] && source "$HOME/.rvm/scripts/rvm"
    
      if [ -f ".ruby-version" ]; then
        rvm use "$(cat .ruby-version)"
      fi
    
      if [ -f ".ruby-gemset" ]; then
        rvm gemset use "$(cat .ruby-gemset)"
      fi
    fi
    
    # http://codeinthehole.com/writing/tips-for-using-a-git-pre-commit-hook/
    FILES_PATTERN='\.rb(\..+)?$'
    FORBIDDEN='debug'
    
    # Quit if no ruby files are being checked in.
    RB_FILES=$(git df --cached --name-only --diff-filter=AM | grep -Ec $FILES_PATTERN)
    if [ "$RB_FILES" = "0" ]; then
        exit 0
    fi
    
    git diff --cached --name-only --diff-filter=AM | \
        grep -E $FILES_PATTERN | \
        GREP_COLOR='37;41' xargs grep --color --with-filename -n $FORBIDDEN && \
        echo 'Please remove debugging statements before commiting.' && exit 1
    
    # Pull in altered files, check with rubocop.
    git diff --cached --name-only --diff-filter=AM | \
        grep -E $FILES_PATTERN | xargs rubocop -f simple | \
        grep 'no offences detected' && exit 0
    # If it didn't exit 0 above, warn of issues, output results.
    echo 'Rubocop has detected issues with your commit.' && \
        git diff --cached --name-only --diff-filter=AM | \
        grep -E $FILES_PATTERN | xargs rubocop -f simple && exit 1
    

    我不想使用sed来解析git diff的结果。有没有更简单的方法来确保我检查索引,而不是磁盘上显示的文件?

    我的直觉告诉我,可能有办法检查git diff --name-only --cached --diff-filter=M git diff --name-only --diff-filter=M中是否有任何文件,如果是这样的话就退出

    欢迎提出其他建议。

1 个答案:

答案 0 :(得分:2)

如果我正确理解了您的问题,您需要拥有手头索引中的文件。

为此,您可以在运行实用程序之前执行git stash -k(保留索引),然后git stash pop假设它不会更改任何内容,以免出现冲突。