Các giải pháp ngắn hoạt động với mô hình con, trong hook và bên trong .git
thư mục
Đây là câu trả lời ngắn mà hầu hết sẽ muốn:
r=$(git rev-parse --git-dir) && r=$(cd "$r" && pwd)/ && echo "${r%%/.git/*}"
Điều này sẽ hoạt động ở bất cứ đâu trong cây làm việc git (bao gồm cả bên trong .git
thư mục), nhưng giả sử rằng (các) thư mục kho lưu trữ được gọi .git
(là mặc định). Với các mô hình con, điều này sẽ đi đến thư mục gốc của kho chứa bên ngoài.
Nếu bạn muốn lấy gốc của mô hình con hiện tại, hãy sử dụng:
echo $(r=$(git rev-parse --show-toplevel) && ([[ -n $r ]] && echo "$r" || (cd $(git rev-parse --git-dir)/.. && pwd) ))
Để dễ dàng thực hiện một lệnh trong thư mục gốc submodule của bạn, dưới [alias]
trong của bạn .gitconfig
, add:
sh = "!f() { root=$(pwd)/ && cd ${root%%/.git/*} && git rev-parse && exec \"$@\"; }; f"
Điều này cho phép bạn dễ dàng làm những việc như git sh ag <string>
Giải pháp mạnh mẽ hỗ trợ tên khác nhau hoặc bên ngoài .git
hoặc $GIT_DIR
thư mục.
Lưu ý rằng $GIT_DIR
có thể chỉ ra một nơi nào đó bên ngoài (và không được gọi .git
), do đó cần phải kiểm tra thêm.
Đặt cái này trong .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"
}
Thực thi nó bằng cách gõ git_root
(sau khi khởi động lại vỏ của bạn exec bash
:)