通过在脚本

时间:2016-06-23 23:51:52

标签: git bash

我有一个生成RPM的构建过程。该团队使用rpm版本号来帮助跟踪版本信息。它们看起来像<program_name>-<version>-<rel_num>.<os_type>.<arch>.rpm;以下是真实的:

  • 版本是语义版本模式 MAJOR MINOR PATCH
  • rel_num 只是存储在版本控制中的每个增加的整数,以帮助使其唯一
  • os_type 是Enterprise Linux 7的el7
  • 按预期 拱门 x86_64 或您有什么

我正在处理的项目的源代码存储在git中。 RPM的此版本号进程继承自subversion(我们团队支持的大多数项目驻留在其中)。

为了保持唯一性,我为项目创建了一个名为rpm的分支,该分支有一个包含名为rpm_build_num的文件的唯一目录。我们的想法是,此文件仅驻留在rpm分支上。在make进程中,调用BASH脚本来检出rpm分支,如果它不存在,则根据origin/rpm创建一个新分支:增加内部版本号,然后将其推回到远程。完成此操作后,脚本会在退出之前恢复分支。简而言之BASH

storedBranch=$(git branch | awk -e '/^\* / {print $2}')
git branch | grep -q rpm
if [[ ${PIPESTATUS[1]} != 0 ]]; then
    git checkout -b rpm origin/rpm
else
    git checkout rpm
fi

# fetch and merge origin/rpm if needed

cd path/to/dir
echo (( $(cat rpm_build_num) + 1 )) > rpm_build_num
git add rpm_buid_num
git commit -m "incrementing the build number"
git push origin rpm
cd -

git checkout ${storedBranch}

问题在于,由于我还不了解的原因,有时从shell提示符开始的make进程会因为它实际使用的分支而丢失。我在这个过程的每个阶段都非常小心,从所有分支中存在的目录开始各种事情,比如这个脚本。然而,我有时仍会看到这一点:

shell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory

上述错误打印出4或5次,而make正在处理几行注释。我几次尝试就没有运气。我的互联网搜索已经产生了许多结果,例如“使用分支机构”或“切换分支机构”,但没有任何与此完全相关的内容。由于我无法更新不同分支上的文件,因此提交并推送它而不实际更改为该分支(我确实找到了该问题的答案),我可以选择哪些选项?

2 个答案:

答案 0 :(得分:0)

一种可行的解决方法是完全避免结账,这意味着避免必须切换分支......因为它们已经被检出。

从git 2.5开始,你可以use multiple working tree 为每个分支创建一个(使用git worktree add作为第二个工作树)
并且您的脚本只需要cd到正确的文件夹,以便修改文件并推送到远程。然后cd回到第一个工作树/分支。

答案 1 :(得分:0)

简而言之,getcwd: cannot access parent directories: No such file or directory意味着您正在尝试在不再存在的目录中执行某些操作。它可以通过几种方式发生,但既然你提到了更改分支,就会发生这样的事情:

你的回购有布局:

repo_path/
  +- a <- you're here
  \- b

您结帐另一个分支,您的布局更改为:

repo_path/
  +- b
  \- c

'a' exists only in memory now, but you're still in it

你运行make - getcwd失败。

我无法猜测在脚本中发生了这一点,但总的来说,我建议您在运行git命令之前确保cd存储库根目录。如果你把它作为所有操作的基础,那么就很难对状态/位置感到困惑。