3

我已经编写了一套 Git 附加组件,供内部使用。它需要在全局模板目录中安装一些 Git 挂钩,但我无法以编程方式定位实际安装 Git 的目录。我在我们的开发服务器上找到了安装:

  • /usr/share/git-core
  • /usr/local/share/git-core
  • /usr/local/git/share/git-core

由于以前的安装,某些服务器在多个这些目录中安装了 Git。我正在寻找一种方法来找出将从中复制模板文件的真实模板目录。git init

有问题的git init代码在copy_templates()

if (!template_dir)
    template_dir = getenv(TEMPLATE_DIR_ENVIRONMENT);
if (!template_dir)
    template_dir = init_db_template_dir;
if (!template_dir)
    template_dir = system_path(DEFAULT_GIT_TEMPLATE_DIR);
if (!template_dir[0])
    return;

DEFAULT_GIT_TEMPLATE_DIR但是,此代码仅在实际要复制模板时运行,因此似乎没有办法事先找出真正的内容。

到目前为止,我最好的想法是(伪代码):

for each possible directory:
    create a random_filename
    create a file in the template directory with $random_filename
    `git init` a new temporary repository
    check for the existence of $random_filename in the new repo
    if it exists, we found the real template directory

这仍然受到必须如上所述构建“可能”目录列表的限制。

有没有更好的办法?

4

1 回答 1

1

这是用 Python 实现的上述想法。这仍然存在可能在其中找到错误git二进制文件的问题$PATH(取决于谁在运行它),因此在我的特定情况下,最好将模板简单地安装在我们可以找到的所有模板目录中(正如 Alan 在上面的评论中提到的那样)。

# This function attempts to find the global git-core directory from
# which git will copy template files during 'git init'. This is done
# empirically because git doesn't appear to offer a way to just ask
# for this directory. See:
# http://stackoverflow.com/questions/16228558/how-can-i-find-the-directory-where-git-was-installed
def find_git_core():
    PossibleGitCoreDirs = [
        "/usr/share/git-core",
        "/usr/git/share/git-core",
        "/usr/local/share/git-core",
        "/usr/local/git/share/git-core",
    ]
    possibles = [x for x in PossibleGitCoreDirs if os.path.exists(x)]
    if not possibles:
        return None
    if len(possibles) == 1:
        return possibles[0]
    tmp_repo = tempfile.mkdtemp()
    try:
        for path in possibles:
            tmp_file, tmp_name = tempfile.mkstemp(dir=os.path.join(path, "templates"))
            os.close(tmp_file)
            try:
                subprocess.check_call(["git", "init"], env={"GIT_DIR": tmp_repo})
                if os.path.exists(os.path.join(tmp_repo, os.path.basename(tmp_name))):
                    return path
            finally:
                os.unlink(tmp_name)
    finally:
        shutil.rmtree(tmp_repo)
    return None
于 2013-04-26T05:18:29.283 回答