在git init中设置默认的目录结构

43

我希望通过在git init命令中自动创建.gitignore、README、LICENSE和其他文件来优化我的git工作流程。

为了做到这一点,我阅读了git init的RTFM文档,网址为http://git-scm.com/docs/git-init,它告诉我可以采取以下几种方法之一:

  1. 使用git init --template=<template_directory>,但这很麻烦。
  2. 更改$GIT_TEMPLATE_DIR环境变量的内容,但我不太想这样做。
  3. 设置init.templatedir配置变量。现在我们谈正事!

所以我用sudo mkdir /usr/share/git-core/templates/my_template创建了一个目录,并在其中使用touch命令创建了一些文件,然后我使用vim ~/.gitconfig打开文件并添加了以下内容:

[init]
    templatedir = /usr/share/git-core/templates/my_template

git config -l 告诉我:

...
init.templatedir=/usr/share/git-core/templates/my_template
...

感到满意后,我进入我的开发目录并执行以下命令:

$ git init
Initialized empty Git repository in /the/current/directory
$ ls -a
.   ..  .git

糟糕...文件在哪里?:(

快速检查:

$ ls -a /usr/share/git-core/templates/my_template
.   ..  .gitignore  LICENSE README.md
$ git --version
git version 1.8.2.1

看起来我使用的命令$ git init --template=/usr/share/git-core/templates/my_template也不起作用。

那么我做错了什么呢?是配置指令不正确吗?模板有问题或者放置位置不对(我在OSX上)?模板应该是一个git仓库吗?还是一个裸库?


3
现在没有时间写完整的答案,但所有模板文件都放在.git文件夹中。 - Nevik Rehnel
6个回答

33
您所看到的行为是git预期的行为:
如果您正确阅读了有关模板目录的手册:

模板目录

模板目录包含文件和目录,这些文件和目录将在创建$GIT_DIR之后复制到其中。

从模板目录中复制的文件被放置在您的GIT_DIR中,默认情况下是您存储库根目录下的.git目录。
据我所知,git init不支持工作树的模板。 如果需要此行为,则应该能够使用一些简单的bash别名或函数来替代您完成此操作。

2
你说得完全正确!实际上,这些文件在.git目录中。 - Oleg
2
你能创建一个包含这些起始文件的仓库,然后使用其中的 .git 目录作为你的模板目录吗? - akraut

11

你可以这样做,但需要多做一些步骤。

  1. 按照正常仓库的方式创建默认目录结构:

mkdir template && cd template
git init && touch README.md && cat ~/.gitignore_global > .gitignore
git add --all && git commit -m "init"

(严格来说,这个最后的提交在这里并不是必要的,但你迟早都得做,为什么现在不做呢)

  1. 现在删除你的工作树并将.git文件上移:

mv .git/* ./ && rm -r README.md .gitignore .git
  • 现在您可以将此设置为默认模板,但为了举例说明:

  • mkdir ../myrepo && cd ../myrepo
    git init --template=../template
    

    (请注意有趣的消息:重新初始化现有的Git存储库...

  • 现在是重要的步骤:(您的存储库已经是最新的,但您的工作树不是):

  • git reset --hard
    

    (如果您之前跳过了提交,则在重置之前必须在此处提交)

    在未来,假设您已设置默认模板,则只需

    git init && git reset --hard
    

    (我没有直接的参考资料,但是这个章节肯定会有帮助。)


    2
    如果您对此处实际发生的管道细节感兴趣,我很乐意解释,但基本上归结为您的git对象(和包)实际上是您的文件(以及提交和目录结构),如果您在模板中正确存储它们,那么您可以在任何已初始化的模板库中恢复它们。当然,所有这些都可以使用更低级别的命令完成,但这样做可以更轻松地避免错误。 - DylanYoung

    8

    您可以创建一个模板存储库,每次想要创建新项目时克隆该存储库。然后,在调用git init之前删除.git文件夹并将内容复制到新项目中。假设您的模板存储库名为project_template:

    $ git clone project_template new_project
    $ cd new_project
    $ rm -rf .git
    $ git init
    

    这并不是一个理想的解决方案,但它可以被脚本化。

    这是对此处提供的步骤进行修改,该步骤特定于使用GitHub。


    2
    虽然这个链接可能回答了问题,但最好包括答案的必要部分在此处,并提供参考链接。仅有链接的答案如果链接页面发生更改,可能会变得无效。 - bummi
    3
    感谢您的反馈,我已经重写了答案,以便在帖子中直接提供信息。 - Nichaladas
    1
    “cp -r…” 的目的是什么?你可以直接使用 “git clone project_template new_project” 来代替。 - Oleg
    避免@bummi所说,您插入的链接已损坏! :( - artu-hnrq
    在 GitHub 帮助文档中,当涉及到从模板创建存储库时,方向不是直接克隆该存储库,而是通过可用的“使用此模板”按钮复制它。这样就不需要删除 .git 目录或运行 git init - artu-hnrq

    4

    您可能会发现cookiecutter工具在自动化基于灵活模板的骨架项目的初始创建方面非常有用:

    https://github.com/audreyr/cookiecutter

    它是跨平台的并且得到积极维护。虽然它是用Python实现的,但它适用于任何类型的项目,不需要任何Python专业知识。最重要的是,你可以轻松地通过GitHub分享你的模板。


    2

    一个适合我的简单解决方案:

    • 在固定位置创建一个目录,并将所需内容放入其中。
    • 然后编写一个脚本,将其内容复制到您想要初始化Git存储库的位置。

    以下是一个示例。

    顺便说一下,这里提供了一些常见的.gitignore配置:https://gist.github.com/octocat/9257657

    设置目录:

    mkdir ~/.git_template_dir
    cd ~/.git_template_dir
    echo "..." > .gitignore
    

    请编写脚本:

    *nix系统:

    #!/bin/bash
    git init
    cp -R ~/.git_template_dir/ .
    

    Windows(%userprofile%相当于~;%cd%相当于.):

    git init
    xcopy %userprofile%\.git_template_dir\ %cd%
    

    然后将其添加到路径中以便轻松访问。


    0
    您需要:
    mkdir -p /usr/local/share/git-templates/hooks
    git config --system init.templatedir '/usr/local/share/git-templates'
    
    • hooks目录中添加您想要的钩子。

    然后在您想要更新的仓库根目录中执行git init命令。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接