如何使用bash cd到具有.git文件夹的最近的父文件夹?

时间:2017-06-01 14:23:49

标签: git bash cd

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

所以,让我们说

  • ~是一个git存储库
  • 我的cwd是~/my-project
  • 我运行命令并被cd到~/my-project/deeply/nested/folder/structure

什么命令可以做到这一点?我需要一个bash功能吗?

3 个答案:

答案 0 :(得分:8)

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

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

我也有~/.gitconfig

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

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

答案 1 :(得分:3)

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

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

即,进入父目录,直到目录.git存在。

如果从git repo外部运行命令,为了防止无限循环,你可以添加一个基本检查:

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

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

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

答案 2 :(得分:0)

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

#!/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(反过来可以变成别名)

相关问题