如何 cd 到最近的父文件夹,该文件夹有一个带 bash 的 .git 文件夹?

How do I cd to the closest parent folder that has a .git folder with bash?

在处理受版本控制的项目时,我经常会在嵌套文件夹中结束。使用 cd ../../ 有点麻烦,所以我想知道是否有一种方法可以在 bash 中定义一个别名,即 cd 到父级,直到它到达带有 .git 文件夹的文件夹,或者它达到 ~.

这么说吧

什么命令可以做到这一点?我需要 bash 函数吗?

您正在寻找的命令是 git rev-parse --show-toplevel,您可以创建一个使用它的 bash 函数。

gr() {
    cd "$(git rev-parse --show-toplevel)"
}

我也有 ~/.gitconfig:

[alias]
    root = rev-parse --show-toplevel

这使得这个命令看起来更合理一些。

我认为您已有的答案很好(并且可能更有效),但实现此目的的基本方法是使用循环:

until [ -d .git ]; do cd ..; done

即移动到父目录,直到目录 .git 存在。

如果您 运行 来自 git 存储库外部的命令,为了防止无限循环,您可以添加基本检查:

until [ -d .git ] || [ "$PWD" = "$p" ]; do p=$PWD; cd ..; done

我不确定它的便携性如何,但在我的系统上我有一个变量 $OLDPWD 可以代替使用:

until [ -d .git ] || [ "$PWD" = "$OLDPWD" ]; do cd ..; done

同样,已经回答了,但我有一个脚本如下,基本上是这样做的:

#!/bin/bash
filename=
[[ ! ${filename} ]] && echo "no filename" && exit -1
path=$(pwd)
while [[ "${path}" != "" && ! -e ${path}/${filename} ]]; do
   path=${path%/*}
done
[[ "${path}" == "" ]] && exit -1;
cd ${path}

你会在哪里findup .git(这又可以变成别名)