微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Linux-在bash脚本中,git无法识别它自己的目录?

因此,我在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目录,而只是创建一个新目录.)

快速简便的修复方法是未设置GIT_DIR.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐