我们有一个特定的要求,我们必须将所有到达的文件推送到某个分支。
我们计划通过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 之类的内容。 此致
答案 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命令都不会继承运行提交钩子的环境