如何使用Bash进入最近的包含.git文件夹的父文件夹?

7
在使用版本控制的项目中,我经常会进入嵌套的文件夹。使用 "cd ../../" 命令变得有点麻烦了,所以我想知道是否有一种方法可以在 bash 中定义一个别名,该别名可以 cd 到父目录,直到它达到一个带有 ".git" 文件夹的目录,或者达到根目录 "~"。
假设:
- "~/my-project" 是一个 git 存储库 - 我的当前工作路径是 "~/my-project/deeply/nested/folder/structure" - 我运行命令并被 cd 到了 "~/my-project"
那么应该使用什么命令?我需要一个 bash 函数吗?

如果你在Unix上使用shell,你可能会在https://unix.stackexchange.com/或https://askubuntu.com上找到很好的答案。 - undefined
3个回答

12

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

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

我在~/.gitconfig文件中也有以下内容:

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

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


2
精简版:将以下内容复制到您的.bash_aliases文件中:alias gr='cd "$(git rev-parse --show-toplevel)"' - Ole

4

我认为你已经得到了一个很好(可能更有效)的答案,但实现这个目标的基本方式是使用循环:

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

1

重申一下,已经回答过了,但是我有一个脚本可以实现这个功能:

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

你可以在哪里执行findup .git命令(这个命令也可以被转化为别名)


我会将第一个测试更改为 ! [ "$filename" ],或者如果你只使用bash,则为 [[ ! $filename ]]。你也可以删除 ! 并使用 || 替换 && - Tom Fenech
这是在Fish中执行相同操作的方法:https://unix.stackexchange.com/a/762098/9041 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接