Solusi singkat yang bekerja dengan submodula, di kait, dan di dalam .git
direktori
Inilah jawaban singkat yang paling diinginkan:
r=$(git rev-parse --git-dir) && r=$(cd "$r" && pwd)/ && echo "${r%%/.git/*}"
Ini akan bekerja di mana saja di pohon kerja git (termasuk di dalam .git
direktori), tetapi mengasumsikan bahwa direktori repositori dipanggil .git
(yang merupakan default). Dengan submodula, ini akan menuju ke akar repositori yang mengandung paling luar.
Jika Anda ingin mendapatkan root dari submodule saat ini:
echo $(r=$(git rev-parse --show-toplevel) && ([[ -n $r ]] && echo "$r" || (cd $(git rev-parse --git-dir)/.. && pwd) ))
Untuk dengan mudah menjalankan perintah di root submodule Anda, [alias]
di bawah di Anda .gitconfig
, tambahkan:
sh = "!f() { root=$(pwd)/ && cd ${root%%/.git/*} && git rev-parse && exec \"$@\"; }; f"
Ini memungkinkan Anda untuk dengan mudah melakukan hal-hal seperti git sh ag <string>
Solusi yang kuat yang mendukung nama yang berbeda atau eksternal .git
atau $GIT_DIR
direktori.
Perhatikan bahwa $GIT_DIR
mungkin menunjuk suatu tempat eksternal (dan tidak bisa disebut.git
), maka kebutuhan untuk pemeriksaan lebih lanjut.
Letakkan ini di .bashrc
:
# Print the name of the git working tree's root directory
function git_root() {
local root first_commit
# git displays its own error if not in a repository
root=$(git rev-parse --show-toplevel) || return
if [[ -n $root ]]; then
echo $root
return
elif [[ $(git rev-parse --is-inside-git-dir) = true ]]; then
# We're inside the .git directory
# Store the commit id of the first commit to compare later
# It's possible that $GIT_DIR points somewhere not inside the repo
first_commit=$(git rev-list --parents HEAD | tail -1) ||
echo "$0: Can't get initial commit" 2>&1 && false && return
root=$(git rev-parse --git-dir)/.. &&
# subshell so we don't change the user's working directory
( cd "$root" &&
if [[ $(git rev-list --parents HEAD | tail -1) = $first_commit ]]; then
pwd
else
echo "$FUNCNAME: git directory is not inside its repository" 2>&1
false
fi
)
else
echo "$FUNCNAME: Can't determine repository root" 2>&1
false
fi
}
# Change working directory to git repository root
function cd_git_root() {
local root
root=$(git_root) || return 1 # git_root will print any errors
cd "$root"
}
Jalankan dengan mengetik git_root
(setelah restart shell Anda: exec bash
)