在git init上设置默认目录结构

Ole*_*leg 30 git templates

我想通过自动创建.gitignore,README,LICENSE和其他git init命令文件来优化我的git工作流程.

要做到这一点,我git inithttp://git-scm.com/docs/git-init的 RTFM,它告诉我做以下其中一项:

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

所以我sudo mkdir /usr/share/git-core/templates/my_templatetouch它中的一些文件,然后我vim ~/.gitconfig和追加:

[init]
    templatedir = /usr/share/git-core/templates/my_template
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

快速检查:

$ ls -a /usr/share/git-core/templates/my_template
.   ..  .gitignore  LICENSE README.md
$ git --version
git version 1.8.2.1
Run Code Online (Sandbox Code Playgroud)

它似乎$ git init --template=/usr/share/git-core/templates/my_template也无效.

那么我在这里做错了什么呢?配置指令不正确?错误的模板或其位置(我在OSX上)?模板应该是git repo吗?一个裸的?

Tux*_*ude 21

您看到的git行为是预期的行为:

如果您正确阅读了有关模板目录的手册:

模板目录

模板目录包含将在创建后复制到$ GIT_DIR的文件和目录.

这是从模板目录复制的文件放置在您的GIT_DIR其中默认为.git你的回购的根目录下的目录.

git init据我所知,不支持工作树的模板.如果需要这种行为,您应该能够编写一些简单的bash别名或函数来为您完成此操作.

  • 你是绝对正确的!实际上,这些文件在 .git 目录中。 (2认同)
  • 您可以创建一个包含这些启动文件的存储库,然后使用其中的“.git”目录作为模板目录吗? (2认同)

Dyl*_*ung 6

你可以做到,但需要一些额外的步骤.

  1. 创建您的默认目录结构,就像它是一个正常的repo:

    mkdir template && cd template
    git init && touch README.md && cat ~/.gitignore_global > .gitignore
    git add --all && git commit -m "init"
    
    Run Code Online (Sandbox Code Playgroud)

(严格来说,这里最后一次提交不是必需的,但你最终必须这样做,所以为什么不现在)

  1. 现在删除您的工作树并移动.git文件:

    mv .git/* ./ && rm -r README.md .gitignore .git
    
    Run Code Online (Sandbox Code Playgroud)
  2. 您现在可以将其设置为默认模板,但为了示例:

    mkdir ../myrepo && cd ../myrepo
    git init --template=../template
    
    Run Code Online (Sandbox Code Playgroud)

    (注有趣的消息:Reinitialized existing Git repository...)

  3. 现在重要的一步:(您的仓库是最新的,但您的工作树不是):

    git reset --hard
    
    Run Code Online (Sandbox Code Playgroud)

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

将来,假设您已经设置了默认模板,那么您就是这么简单

git init && git reset --hard
Run Code Online (Sandbox Code Playgroud)

(我没有直接的参考,但本章肯定有帮助.)

  • 如果您对这里实际发生的管道的更详细解释感兴趣,我很乐意解释,但本质上它归结为这样一个事实:您的 git 对象(和包)实际上是您的文件(以及提交和目录结构),如果您将它们正确存储在模板中,那么您可以在任何模板初始化的存储库中恢复它们。当然,这也可以使用较低级别的命令来完成,但这样更容易避免错误。 (2认同)

Nic*_*das 5

您可以创建一个模板存储库,每次要创建一个新项目时都可以对其进行克隆。然后,您删除.git文件夹并将内容复制到新项目中,然后再调用git init。假设您的模板存储库称为project_template:

$ git clone project_template new_project
$ cd new_project
$ rm -rf .git
$ git init
Run Code Online (Sandbox Code Playgroud)

不是理想的解决方案,但是可以编写脚本。

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

  • 虽然此链接可以回答问题,但最好在[此处](http://meta.stackoverflow.com/a/8259) 包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会变得无效。 (2认同)
  • 感谢您的反馈,我已经重写了答案以直接在帖子中提供信息。 (2认同)