Hàm bash / zsh mà cd tới gốc của cây git
Nov 26 2020
Tôi muốn nhận được đánh giá cho chức năng cd vào gốc cây git hoặc không làm gì nếu chúng tôi ở bên ngoài kho lưu trữ.
phiên bản đã đánh giá:
# cd to the root of the current git directory
# If $PWD is submodule, will cd to the root of the top ancestor # It requires to stay in the current directory, if the root is . or unknown, # and use cd only once, to have a way to do `cd -` function cg { git_root() { local super_root local top top="$(git rev-parse --show-cdup)"
top="${top:-./}" super_root="$(git rev-parse --show-superproject-working-tree)"
if [[ "$super_root" ]]; then printf '%s' "$top../"
( cd "$top../" && git_root || return ) fi printf '%s' "$top"
}
local git_root
git_root="$(git_root)" [ "x${git_root}" != "x./" ] && cd "$(git_root)" && return || return 0
}
phiên bản cập nhật:
#!/bin/bash
# cd to the root of the current git directory
# If $PWD is submodule, will cd to the root of the top ancestor
# It requires to stay in the current directory, if the root is . or unknown,
# and use cd only once, to have a way to do `cd -`
function cg {
function git_root {
local top; top="$(git rev-parse --show-cdup)" top="${top:-./}"
local super_root; super_root="$(git rev-parse --show-superproject-working-tree)" if [[ "$super_root" ]]; then
printf '%s' "$top../" ( cd "$top../" && git_root || return )
fi
printf '%s' "$top" } local tree_root tree_root="$(git_root)"
[[ "x${tree_root}" != "x./" ]] && cd "${tree_root}" && return || return 0
}
Trả lời
4 chicks Nov 26 2020 at 10:12
Tuyệt quá
- 100% vượt qua shellcheck , nghĩa là bạn đang làm rất tốt với việc trích dẫn mọi thứ có thể có vấn đề.
- biến phạm vi
- sử dụng
[[điều kiện choif - giải thích tốt về những gì nó đang làm và tại sao
Có thể tốt hơn
- một dòng sh-bang ở trên cùng là một ý tưởng hay cho các tập lệnh, ngay cả khi điều này thường chỉ được lấy nguồn trong các tập lệnh đăng nhập của bạn.
- Hàm bên trong của bạn được định nghĩa với cú pháp khác với hàm bên ngoài của bạn.
- Bạn có thể xác định phạm vi và xác định một biến trong một dòng. Ví dụ:
local super_root="$(git rev-parse --show-superproject-working-tree)". Điều này đảm bảo bạn không xác định biến cục bộ hoặc không xác định phạm vi một biến mới. Và nó cắt ra một dòng mã trong mỗi trường hợp. - Việc sử dụng lại
git_roottên biến và tên hàm gây nhầm lẫn. Ban đầu tôi tự hỏi tại sao bạn lại cố gắng mở rộng hàm sau khi bạn vừa định nghĩa nó. - sử dụng
[[điều kiện cho điều kiện ở dòng cuối cùng.