git克隆不同的存储库在git hooks中创建麻烦

时间:2018-03-13 06:52:30

标签: git commit githooks pre-commit-hook pre-commit

我们有一个特定的要求,我们必须将所有到达的文件推送到某个分支。

我们计划通过git hooks专门实现commit-msg hook。

在这样做的同时,我们将分支克隆到临时位置(/ tmp /),然后在git commit-msg钩子中,尝试将到达的文件提交到某个分支。

但现在发生的事情是我们在/ tmp /.

中看到所有文件都被删除了

Crude commit-msg脚本如下: -

#!/bin/bash
#
#!/usr/bin/env bash

#git config credential.helper store
REPOSRC="https://<USER>:<PASS>@<REPO_URL>"
LOCALREPO="<LOCAL_REPO_DIR>"

echo "Pulling code to temporarry location";

cd /tmp && git clone "${REPOSRC}" || (cd "${LOCALREPO}"; git pull;)

#here when I navigate to /tmp/<LOCALREPO> all files are listed as DELETED

git diff --cached --name-status | while read st file; do

    echo "file == $file and status == $st";

                    if [ "$st" == "A" ]; then
                        cd "${LOCALREPO}" && git add "$file" && git commit "$file" -m "$COMMIT_MSG" && git push origin "$branch"
                    else
                        cd "${LOCALREPO}" && git commit "$file" -m "$COMMIT_MSG" && git push origin "$branch"
                    fi
done

这可能是什么原因?

编辑:

GIT_INDEX_FILE 显示提交已启动而非 / tmp / 路径的索引文件的路径。有没有办法改变这个变量? 索引文件也会输出 next-index-32419.lock 之类的内容。 此致

3 个答案:

答案 0 :(得分:5)

每当钩子更改文件夹时,检查以下值是非常重要的:

  • GIT_DIR(在您的情况下应引用正确的.git repo文件夹)
  • GIT_WORK_TREE(应该引用预期的文件夹)

这就是为什么,对于任何Git命令,您需要将git替换为:

git --work-tree=$(pwd) ...

(或/path/to/your/working/tree

答案 1 :(得分:1)

在开发pre-commit(将git挂钩作为可安装的git存储库分发)时,我遇到了同样的问题。

GIT_*环境变量正在干扰git clone命令。这些环境变量是在调用git脚本之前由.git/hooks/pre-commit内部人员设置的。

我对此的解决方案是清除所有GIT_*环境变量(允许变量白名单除外)。

My solution是python语言,但您可以将其改编成您使用的任何语言:

def no_git_env(_env=None):
    # Too many bugs dealing with environment variables and GIT:
    # https://github.com/pre-commit/pre-commit/issues/300
    # In git 2.6.3 (maybe others), git exports GIT_WORK_TREE while running
    # pre-commit hooks
    # In git 1.9.1 (maybe others), git exports GIT_DIR and GIT_INDEX_FILE
    # while running pre-commit hooks in submodules.
    # GIT_DIR: Causes git clone to clone wrong thing
    # GIT_INDEX_FILE: Causes 'error invalid object ...' during commit
    _env = _env if _env is not None else os.environ
    return {
        k: v for k, v in _env.items()
        if not k.startswith('GIT_') or
        k in {'GIT_EXEC_PATH', 'GIT_SSH', 'GIT_SSH_COMMAND'}
    }

答案 2 :(得分:0)

我只是在干净的环境中执行我的git命令。现在的问题是如何做到这一点?

$ env --help | grep env
Usage: env [OPTION]... [-] [NAME=VALUE]... [COMMAND [ARG]...]
Set each NAME to VALUE in the environment and run COMMAND.
  -i, --ignore-environment  start with an empty environment
  -u, --unset=NAME     remove variable from the environment
A mere - implies -i.  If no COMMAND, print the resulting environment.
Full documentation at: <http://www.gnu.org/software/coreutils/env>

因此使用-i会给你的git命令一个干净的环境。但是您可能需要存在某些变量。所以我只想在下面添加到我的脚本顶部

alias git='env -i PATH=$PATH HOME=$HOME git'

现在你在钩子中运行的所有git命令都不会继承运行提交钩子的环境