我已经编写了一套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
这仍然受到必须构建上述“可能”目录列表的限制。
有更好的方法吗?
答案 0 :(得分: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