因此,我在Atlassian-Stash中编写了一个bash脚本,用于接收后事件.在此脚本中,提交后,将创建一个代码协作者代码审查.要创建代码审查,它需要提交标题,提交用户和git SHA进行任何更改,并将更改上传到代码审查中.为了获得这些信息,我将目录克隆到–depth = 1(甚至没有–depth = 1)并使用git log(选项).
我看到的问题是,如果我手动运行脚本,它就可以正常工作.但是,如果它在提交后运行,则在克隆目录说它不是git目录后会出错.如果我在脚本退出后进入目录,则可以运行git log(和其他git命令).
我尝试解决的问题是
1.权限问题(以root用户身份运行),因此我没有看到任何权限问题.
2.使用bash -xv对其进行故障排除,直到这一切看起来都不错.
3.我还用$?来进行状态检查.
4.我尝试将.git移至git-backup,等待3秒钟,然后将其移回,仍然是相同的问题.
5.我运行ls -ltra以确保它具有所有文件和.git目录.
现在,我没有选择了.有人遇到过这种问题吗?
有人知道我在哪里做错什么或错过什么吗?
我试图尽可能地进行描述,如果问题没有道理或需要示例脚本,请告诉我.
#!/bin/bash -xv
CCollabExe='/usr/local/bin/ccollab'
CCollabUrl='--url http://***:8080'
CCollabUser='--user ******'
CCollabPassword='--password ******'
CCollabConnection="${CCollabExe} ${CCollabUrl} ${CCollabUser} ${CCollabPassword}"
CCollabStuff='/home/stash/repositories/tmp'
CloneDir="${CCollabStuff}/ClonnedDir"
StashUser='******'
StashPass='******'
RepoURLlinkGit="http://${StashUser}:${StashPass}@******:7990/scm/t/test1.git"
unset SSH_ASKPASS
# Test function to check if a varibale is empty
CheckIfVarEmpty () {
local Variable="$1"
if [[ -z ${Variable} ]] ; then
echo "Variable $1 '\${Variable}' is empty, exiting"
echo "Lets try to go back in the git dir" && cd ${CloneDir} && git log -10
cd /root && cd ${CloneDir}
[[ -d .git ]] && cp -rp .git git-backup && rm -rf .git && echo "sleeping 3" && sleep 3 && mv git-backup .git
git log -10
exit 0
fi
}
#Create a new CCollab temp dir, clone the directory and get commit title, user and SHA info
rm -rf ${CCollabStuff} && mkdir ${CCollabStuff} && cd ${CCollabStuff}
git clone ${RepoURLlinkGit} ${CloneDir}
cd ${CloneDir}
下面的#是错误所在.
CommitTitle=$(git log --pretty=format:"%s" -1)
CheckIfVarEmpty ${CommitTitle}
CommitUser=$(git log --pretty=format:"%an" -1)
CheckIfVarEmpty ${CommitUser}
CommitSHA=$(git log --pretty=format:"%h" -2)
CheckIfVarEmpty ${CommitSHA}
CommitSHA1=$(echo $CommitSHA | awk -F' ' '{ print $1 }')
CommitSHA2=$(echo $CommitSHA | awk -F' ' '{ print $2 }')
echo "=========="
remote: rm -rf ${CCollabStuff} && mkdir ${CCollabStuff} && cd ${CCollabStuff}
remote: + rm -rf /home/stash/repositories/tmp
remote: + mkdir /home/stash/repositories/tmp
remote: + cd /home/stash/repositories/tmp
remote: git clone ${RepoURLlinkGit} ${CloneDir}
remote: + git clone http://******:******@******:7990/scm/t/test1.git /home/stash/repositories/tmp/ClonnedDir
remote: cloning into '/home/stash/repositories/tmp/ClonnedDir'...
remote: cd ${CloneDir}
remote: + cd /home/stash/repositories/tmp/ClonnedDir
remote: CommitTitle=$(git log --pretty=format:"%s" -1)
remote: git log --pretty=format:"%s" -1
remote: ++ git log --pretty=format:%s -1
remote: fatal: Not a git repository: '.'
解决方法:
我对Atlassian一无所知,但是从错误输出中可以清楚地看到,您正在绊倒我在现在找不到的答案中指出的一个钩子陷阱:
>在git挂钩中,设置了环境变量GIT_DIR(在–bare仓库中为.,在非仓库中为.git).这仅在您CD到其他目录之前才有效,并且通常是在从钩子脚本运行的子进程中执行,而该钩子脚本不知道$GIT_DIR指向某个不适合的位置.
(git clone步骤之所以起作用,是因为它不查找git目录,而只是创建一个新目录.)