คำตอบสั้น ๆ ที่ใช้งานได้กับ submodules, hooks, และภายใน .git
ไดเรกทอรี
นี่คือคำตอบสั้น ๆ ที่คนส่วนใหญ่ต้องการ:
r=$(git rev-parse --git-dir) && r=$(cd "$r" && pwd)/ && echo "${r%%/.git/*}"
สิ่งนี้จะทำงานที่ใดก็ได้ในแผนผังการทำงาน git (รวมถึงภายใน.git
ไดเรกทอรี) แต่สมมติว่ามีการเรียกไดเรกทอรีเก็บข้อมูล.git
(ซึ่งเป็นค่าเริ่มต้น) ด้วย submodules สิ่งนี้จะไปที่รูทของพื้นที่เก็บข้อมูลด้านนอกสุด
หากคุณต้องการไปที่รูทของการใช้ submodule ปัจจุบัน:
echo $(r=$(git rev-parse --show-toplevel) && ([[ -n $r ]] && echo "$r" || (cd $(git rev-parse --git-dir)/.. && pwd) ))
ในการดำเนินการคำสั่งในรูท submodule ของคุณอย่างง่ายดายภายใต้[alias]
ของคุณ.gitconfig
ให้เพิ่ม
sh = "!f() { root=$(pwd)/ && cd ${root%%/.git/*} && git rev-parse && exec \"$@\"; }; f"
สิ่งนี้ช่วยให้คุณทำสิ่งต่าง ๆ เช่น git sh ag <string>
โซลูชันที่แข็งแกร่งซึ่งรองรับชื่อแตกต่างกันหรือภายนอก.git
หรือ$GIT_DIR
ไดเรกทอรี
โปรดทราบว่า$GIT_DIR
อาจชี้ที่ภายนอก (และไม่ถูกเรียก.git
) ดังนั้นจึงจำเป็นต้องมีการตรวจสอบเพิ่มเติม
ใส่สิ่งนี้ใน.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"
}
ดำเนินการได้โดยการพิมพ์git_root
(หลังจากรีสตาร์ทเปลือกของคุณ: exec bash
)