我是否可以通过 cd 转到目录树中的祖先而不需要知道需要转到多远?

我是否可以通过 cd 转到目录树中的祖先而不需要知道需要转到多远?

我正在编写一个脚本来自动添加、提交和推送更改到我的子模块和存储库。有些子模块嵌套得比其他子模块更深,我需要使用 cd 命令返回到存储库的根目录。我没有使用该git submodule foreach模式,因为其他子模块中可能存在更改,而我不想从我正在处理的分支提交给它们(快速测试)。我在超级存储库中为每个子模块设置了一个分支,这个分支的命名很方便,因此使用 cd 命令会向下移动到存储库。

我发现这个问题其中有与创建和/或为 cd 向上 n 级的函数设置别名相关的答案。我可以做类似的事情,因为我已经为其他操作设置了一些别名函数,但这需要为每个目录设置不同的函数或不同的脚本,因此在 Git Extensions 中需要不同的热键,而 Git Extensions 处于不同的级别。

我正在使用 Git Extensions 来管理我的仓库,它在其设置中提供了一个脚本界面。我当前的功能位于 .git/config 中的别名下:

applyupdate = "!f() { \
                      cd \"$1\"/;\
                      git add .;\
                      git commit -m \"$2\";\
                      git push;\
                      cd ..;\ #####this needs to be n levels
                      git add \"$1\";\
                      git commit -m \"$2\";\
                      git push;\
                    }; f"

这是在 Git Extension 中通过热键执行的,并使用以下参数运行它:

applyupdate {cBrnach} {{UserInput}}

如果图中有多个位于同一次提交上,则活动分支将位于哪里{cBranch},或者请求一个分支
,并将{{UserInput}}弹出一个对话框来插入引用的提交消息。

可以cd n-levels用一个函数来完成,而且我不需要输入我需要上升多少层?我认为{UserInput}Git Extensions 中的选项不适用于多个输入。

答案1

谢谢阿卡迪乌什·德拉布奇克提到git rev-parse --show-toplevel
将脚本更改为以下内容对我有用:

applyupdate = "!f() { \
                      cd \"$1\"/;\
                      git add .;\
                      git commit -m \"$2\";\
                      git push;\
                      cd ..;\ #this gets me out of the submodule
                      cd \"$(git rev-parse --show-toplevel)\";\ #this return to super-repo's root
                      git add \"$1\";\
                      git commit -m \"$2\";\
                      git push;\
                    }; f"

相关内容