Git 如何*完全*指定不同的';。吉特';迪尔

Git 如何*完全*指定不同的';。吉特';迪尔,git,Git,如果指定GIT_DIR=“.git2”,它将只指定相对于当前目录的内容。在本例中,它不会像对默认的“.git”那样,在包含“.git2”协议的第一个父目录之前进行“搜索” 此外,如果指定完整路径,如/home/me/project/.git2,则不会将文件添加并提交到存储库中相对于“.git2”位置的路径 所以问题是-有没有办法将git使用的文件夹名替换为“.git”以外的其他名称,并使协议的所有其他方面的工作方式与默认“.git”名称完全相同 所以问题是-有没有办法将git使用的文件夹名替换为

如果指定GIT_DIR=“.git2”,它将只指定相对于当前目录的内容。在本例中,它不会像对默认的“.git”那样,在包含“.git2”协议的第一个父目录之前进行“搜索”

此外,如果指定完整路径,如/home/me/project/.git2,则不会将文件添加并提交到存储库中相对于“.git2”位置的路径

所以问题是-有没有办法将git使用的文件夹名替换为“.git”以外的其他名称,并使协议的所有其他方面的工作方式与默认“.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 "$@"
)