我有一个生成RPM的构建过程。该团队使用rpm版本号来帮助跟踪版本信息。它们看起来像<program_name>-<version>-<rel_num>.<os_type>.<arch>.rpm
;以下是真实的:
我正在处理的项目的源代码存储在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正在处理几行注释。我几次尝试就没有运气。我的互联网搜索已经产生了许多结果,例如“使用分支机构”或“切换分支机构”,但没有任何与此完全相关的内容。由于我无法更新不同分支上的文件,因此提交并推送它而不实际更改为该分支(我确实找到了该问题的答案),我可以选择哪些选项?
答案 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
存储库根目录。如果你把它作为所有操作的基础,那么就很难对状态/位置感到困惑。