Git 如何*完全*指定不同的';。吉特';迪尔
如果指定GIT_DIR=“.git2”,它将只指定相对于当前目录的内容。在本例中,它不会像对默认的“.git”那样,在包含“.git2”协议的第一个父目录之前进行“搜索” 此外,如果指定完整路径,如/home/me/project/.git2,则不会将文件添加并提交到存储库中相对于“.git2”位置的路径 所以问题是-有没有办法将git使用的文件夹名替换为“.git”以外的其他名称,并使协议的所有其他方面的工作方式与默认“.git”名称完全相同 所以问题是-有没有办法将git使用的文件夹名替换为“.git”以外的其他名称,并使协议的所有其他方面的工作方式与默认“.git”名称完全相同Git 如何*完全*指定不同的';。吉特';迪尔,git,Git,如果指定GIT_DIR=“.git2”,它将只指定相对于当前目录的内容。在本例中,它不会像对默认的“.git”那样,在包含“.git2”协议的第一个父目录之前进行“搜索” 此外,如果指定完整路径,如/home/me/project/.git2,则不会将文件添加并提交到存储库中相对于“.git2”位置的路径 所以问题是-有没有办法将git使用的文件夹名替换为“.git”以外的其他名称,并使协议的所有其他方面的工作方式与默认“.git”名称完全相同 所以问题是-有没有办法将git使用的文件夹名替换为
我不认为有任何方法可以做到这一点。为什么不将完整路径设置为
.git2
为GIT\u DIR
,并为GIT\u WORK\u DIR
设置完整路径?关于如何GIT_工作\u目录
和GIT_目录
的规则决定了工作目录和GIT目录的顶部,这些规则很复杂,很容易出错。如果同时设置这两个路径(并将它们设置为绝对路径),则问题通常会少很多。如果要对特定存储库执行此操作:
export GIT_DIR=/home/me/project/.git2
export GIT_WORK_TREE="$(dirname "${GIT_DIR}")"
git ...
或:
如果您想在任何地方更改Git目录的默认名称,可以执行如下复杂操作:
git() (
# if GIT_DIR is set, honor it
[ -z "${GIT_DIR+set}" ] || { command git "$@"; exit $?; }
# find GIT_DIR
GIT_DIR=$(
: "${GIT_DIR_NAME=.git2}"
while true; do
[ -d "${GIT_DIR_NAME}" ] && {
printf '%s\n' "${PWD%/}/${GIT_DIR_NAME}"
exit 0
}
[ "$(pwd -P)" != / ] || {
echo "fatal: Not a git repository" >&2
exit 1
}
cd .. || exit 1
done
) || exit 1
# set GIT_WORK_TREE based on GIT_DIR if it is not already set
[ -n "${GIT_WORK_TREE+set}" ] || {
GIT_WORK_TREE=$(dirname "${GIT_DIR}") || exit 1
}
# run the actual git with the discovered directories
GIT_DIR=${GIT_DIR} GIT_WORK_TREE=${GIT_WORK_TREE} command git "$@"
)
根据以上内容,当您运行
gitfoo
时,它将搜索.git2
,而不是.git
。对于工作目录,它将使用包含.git2
的目录,为什么要这样做?一点背景可能会对我们有所帮助。一般来说,我想不带偏见地了解:)但是:在这种情况下,我有一个私人内部回购和一个公共回购,希望两者保持同步和独立,但都植根于同一棵树。理想的情况是,如果可以分配特定存储库的“精选”子集,那么当“公共”用户访问它时,它将只包含来自特定分支的数据,而不包含完整的历史,但是由于git将事物压缩成非分支特定的捆绑包,其中包含自存储库创建以来所有事物的历史记录,这显然在git中目前是不可能的。FWIW,我将只使用子模块。让子模块成为公共存储库,让父模块成为真正的存储库。在我看来,这会容易得多。看看这个,但这两棵树都有相同的根和结构。谢谢-我想脚本就是要做的。
git() (
# if GIT_DIR is set, honor it
[ -z "${GIT_DIR+set}" ] || { command git "$@"; exit $?; }
# find GIT_DIR
GIT_DIR=$(
: "${GIT_DIR_NAME=.git2}"
while true; do
[ -d "${GIT_DIR_NAME}" ] && {
printf '%s\n' "${PWD%/}/${GIT_DIR_NAME}"
exit 0
}
[ "$(pwd -P)" != / ] || {
echo "fatal: Not a git repository" >&2
exit 1
}
cd .. || exit 1
done
) || exit 1
# set GIT_WORK_TREE based on GIT_DIR if it is not already set
[ -n "${GIT_WORK_TREE+set}" ] || {
GIT_WORK_TREE=$(dirname "${GIT_DIR}") || exit 1
}
# run the actual git with the discovered directories
GIT_DIR=${GIT_DIR} GIT_WORK_TREE=${GIT_WORK_TREE} command git "$@"
)