如何将空目录添加到 Git 存储库?

问题描述:

如何将空目录(不包含文件)添加到 Git 存储库?

解决方案1:

打造属于自己的副业,开启自由职业之旅,从huntsbot.com开始!

使目录保持(几乎)空(在存储库中)的另一种方法是在该目录中创建一个 .gitignore 文件,其中包含以下四行:

# Ignore everything in this directory
*
# Except this file
!.gitignore

这样您就不必像在 m104 的 solution 中那样正确地获得订单了。

这也带来了好处,即当您执行 git status 时,该目录中的文件不会显示为“未跟踪”。

使 @GreenAsJade 的评论持久化:

我认为值得注意的是,这个解决方案正是问题所要求的,但也许不是许多查看这个问题的人一直在寻找的。此解决方案保证目录保持为空。它说“我真的不想在这里签入文件”。与“我这里还没有要签入的文件,但我需要这里的目录,文件可能稍后会出现”相反。

我认为@JohnMee提出的README解决方案应该和这个一起使用; .gitignore 文件解释了我们希望避免版本控制的内容,而 README 文件解释了目录的用途,这两个都是非常重要的信息。

@pedromanoel 我编写了您将放入 .gitignore 文件中的 README 的文档(作为注释)。

发现 1 个不同之处:1.)一个空文件夹,2.)一个包含 .gitignore 文件的文件夹。 ;-)

这非常适合缓存文件夹。

不幸的是,这会导致一个非空目录,它有一个隐藏文件。

解决方案2:

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求

你不能。请参阅 Git FAQ。

目前 git 索引(暂存区)的设计只允许列出文件,并且没有足够能力进行更改以允许空目录的人足够关心这种情况来补救它。在目录中添加文件时会自动添加目录。也就是说,目录永远不必添加到存储库中,并且不会自行跟踪。你可以说“git add ”,它会在那里添加文件。如果您确实需要一个目录存在于结帐中,您应该在其中创建一个文件。 .gitignore 很适合这个目的;您可以将其留空,或填写您希望在目录中显示的文件的名称。

下面的答案要好得多。事实上,低级软件 git 不允许它对我来说并不重要,因为当我需要一个空目录时如何实际使用 Git。添加 2 行 .gitignore 对我来说似乎是可以接受的。

对于这个常见问题,您可以在整个 Internet 上阅读“不可能,您不能,等等。”。 .gitignore 技巧是一个常见的答案,可以满足许多需求。然而有可能让 git track 成为一个真正空的目录,see my answer

虽然我想得越多,就越感觉像“空字符串的 SHA 哈希”,如果它存在,实际上将是一个明确定义的空树标识符,除非无法判断该对象是否是一棵树或一团。

我已经看到很多存储库为此使用了一个名为 .gitkeep 的空文件。

@Amala:当您说“下面”时,您指的是什么。答案的顺序正在改变......

解决方案3:

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。

在目录中创建一个名为 .gitkeep 的空文件,然后添加它。

.gitkeep 不是 Git 规定的,它会让人们第二次猜测它的含义,这将引导他们到谷歌搜索,这将引导他们到这里。 .git 前缀约定应保留给 Git 本身使用的文件和目录。

@t-mart“应该保留 .git 前缀约定......”为什么? git 是否请求此预订?

在这种情况下,README 或 ABOUT 文件会同样好或更好。给下一个人留个便条,就像我们在 URL 之前所做的那样。

如果您正在编写应在空目录上测试代码的单元测试,则不起作用...

@szablica 我认为这根本不会令人困惑。事实上,我认为将其命名为 .gitkeep 非常直观。称它为 .gitignore 对我来说听起来很矛盾。所以这只是个人口味的问题。

解决方案4:

huntsbot.com提供全网独家一站式外包任务、远程工作、创意产品分享与订阅服务!

您始终可以在目录中放置一个 README 文件,并说明您为什么要在存储库中使用此目录,否则为空目录。

+1,好建议,除非将来要使用,否则空目录没有任何意义。所以在里面创建一个 README 文件,写下这个目录是干什么用的,以后会放什么文件。这解决了这两个问题。

@ilius 废话。在许多情况下,可能非常需要包含空目录的目录结构(例如 MVC 应用程序,您需要一个模型目录但尚未开始创建任何模型,或者您计划稍后添加共享视图的共享视图目录)。此外,在其中的每一个中都放一个 README 是多余的,因为它们的用途很明显,而且很容易忘记在每个中都放一个 README。并且当您向其中添加一些其他文件时,您必须记住删除自述文件。基本上,git 绝对应该允许空目录。

@Jez:我不同意。关键是 git 旨在控制(和索引)源代码。重要的是,提交的 id 是内容的散列。也就是说,它必须有内容。树的每个部分都不需要自述文件,只需要叶节点。如果您有打算放置代码的地方,但没有代码,并且您甚至不会花时间回显“模型的地方”>>自述文件,那么您所拥有的只是一个想法而不是提交。对 git 不感兴趣。说“我希望正在运行的应用程序有 XYZ 空目录”是运行时问题,而不是源问题。与您的安装人员一起处理它。

@JoeAtzberger 这是一个缺失的功能,而不是有意的限制。来自 Git 常见问题解答:目前 Git 索引(暂存区)的设计只允许列出文件,并且没有足够能力进行更改以允许空目录的人足够关心这种情况来补救它。

@jbo5112 是的,您指的“特殊代码”是我提到的“安装程序”。您的 webapp 安装已经必须处理创建数据库、本地配置、拉取依赖项或 100 个其他操作,但是几个空目录超出了它的范围?尝试 gradle、passenger、chef、原始 Makefile 等。创建目录和安装应用程序的其他(可能更复杂/危险)工作之间没有安全差异。如果你真的没有 deps、config、DB 等,也没有安装程序,那么只需使用 README。没有任何情况要求您两者都做。

解决方案5:

huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感

touch .placeholder

在 Linux 上,这会创建一个名为 .placeholder 的空文件。值得一提的是,这个名称对 git 来说是不可知的,并且这种方法用于系统中的其他各个地方,例如 /etc/cron.d/.placeholder。其次,正如另一位用户所指出的,.git 前缀约定可以保留给 Git 本身用于配置目的的文件和目录。

或者,如另一个 answer 中所述,目录可以包含描述性 README.md file。

无论哪种方式,这都要求文件的存在不会导致您的应用程序中断。

这对于初始的裸目录很有用,但是如果它开始充满文件怎么办?然后 Git 会注意到它们并将它们声明为未跟踪的文件。此处选择的答案更优雅地工作,以允许保留目录但随后安全地忽略内容。

问题和主要的普遍关注是关于添加一个空目录。如果它以后有一个常驻文件,显然删除 .keep 文件或忽略它。相反,如果要忽略目录中的文件,那将是一个完全不同的问题。

建议 git clean -nd | sed s/'^Would remove '// | xargs -I{} touch "{}.keep" 在所有未跟踪的空目录中执行此操作。

不喜欢这个解决方案,很难猜出这个文件的作用。此外,如果您在开发环境中生成文件(如日志或图像等),这并不能阻止这些文件被版本化并进入生产环境,这并不好。

优雅:.keep 文件连同提交消息 显示了“保留”项目结构的意图。添加自述文件或关于我认为会引起更多混乱...

解决方案6:

HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com

为什么我们需要空的版本化文件夹

第一件事:

在 Git 版本控制系统下,空目录不能是树的一部分。

它根本不会被跟踪。但是在某些情况下,“版本控制”空目录可能是有意义的,例如:

搭建预定义的文件夹结构,使其可供存储库的每个用户/贡献者使用;或者,作为上述的特殊情况,为临时文件创建一个文件夹,例如 cache/ 或 logs/ 目录,我们希望在其中提供文件夹但 .gitignore 其内容

与上述相关,某些项目在没有某些文件夹的情况下将无法工作(这通常暗示项目设计不佳,但这是一个常见的现实场景,也许可能存在需要解决的权限问题)。

一些建议的解决方法

许多用户建议:

放置一个 README 文件或另一个包含某些内容的文件以使目录非空,或者使用一种“反向逻辑”(即包含所有文件)创建一个 .gitignore 文件,最后服务于方法#1的相同目的。

虽然这两种解决方案都有效,但我发现它们与有意义的 Git 版本控制方法不一致。

为什么你应该在你的项目中放置你可能并不真正想要的伪造文件或自述文件?

为什么要使用 .gitignore 来做与它的用途(不包括文件)完全相反的事情(保存文件),即使它是可能的?

.gitkeep 方法

使用名为 .gitkeep 的 empty 文件以强制该文件夹存在于版本控制系统中。

虽然看起来差别不大:

您使用的文件仅用于保存文件夹。你不要放任何你不想放的信息。例如,您应该使用自述文件作为包含有用信息的自述文件,而不是作为保留文件夹的借口。关注点分离总是一件好事,您仍然可以添加 .gitignore 来忽略不需要的文件。

将其命名为 .gitkeep 可以从文件名本身(以及其他开发人员,这对于共享项目和 Git 存储库的核心目的之一)来说非常清晰和直接,该文件是与代码无关的文件(由于前导点和名称)与 Git 明确相关的文件其目的(保留)已明确说明且一致且语义相反,其含义可忽略

与代码无关的文件(因为前导点和名称)

与 Git 明显相关的文件

它的目的(保持)被清楚地陈述并且在其含义上是一致的和语义上相反的以忽略

采用

我已经看到 Laravel、Angular-CLI 等非常重要的框架采用了 .gitkeep 方法。

您错过了一个想法 - 保留和清空文件夹(例如 /logs、/tmp、/uploads)的原因是什么?是的 - 它保持文件夹为空。 :) 因此,如果您想保持文件夹为空,则必须忽略其中的文件。

@RomanAllenstein:不一定。可能是您创建了一个具有给定结构的存储库,以后可以填充该结构。这些文件将在创建后立即添加到存储库中,开始删除或编辑 .gitignore 文件会很烦人(而且很危险,因为您可能甚至没有意识到它们没有被跟踪:git 忽略了它们)

如果您编辑答案以将 .gitkeep 替换为任何其他非 git 前缀的文件名,您会得到我的支持,我认为这是最好和最有用的答案。原因:我认为“.git*”应该保留给 git 规定的文件,而这只是一个占位符。当我看到它时,我的第一个猜测是,例如“.gitkeep”文件会被自动忽略(这将是一个不错的功能),但事实并非如此,对吧?

@Santosh您可以编辑我的帖子并对社区有用,而不是幼稚地吹嘘非母语人士并无用地污染评论,这与平均智能行为[IN]一致。这就是编辑的原因,顺便说一句。无论如何感谢您的免费课程,非常感谢:)

我想知道为什么人们很难理解为什么要向 git 添加“空”文件夹。你必须从某个地方开始,对吧?所以,通常你从你的项目文件夹结构开始 - 唉 - 在项目开始时还没有任何东西。一旦你的项目 repo 完成,团队工作人员可以克隆并开始使用 SAME 结构。

解决方案7:

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。

如其他答案中所述,Git 无法在其暂存区域中表示空目录。 (请参阅 Git FAQ。)但是,如果出于您的目的,如果一个目录仅包含一个 .gitignore 文件就足够空,那么您只能通过以下方式在空目录中创建 .gitignore 文件:

find . -type d -empty -exec touch {}/.gitignore \;

您可能想忽略 .git 目录:find . -name .git -prune -o -type d -empty -exec touch {}/.gitignore \;

对于大多数情况,一个更简单的变体是 find * -type d -empty -exec touch {}/.gitignore \;

由于 OS X 几乎在每个目录中都创建了一个 .DS_Store 文件,因此这在那里不起作用。我发现的唯一(危险!)解决方法是首先通过 find . -name .DS_Store -exec rm {} \; 删除所有 .DS_Store 文件,然后使用此答案中的首选变体。请务必仅在正确的文件夹中执行此操作!

有谁知道从命令行在 Windows 中执行此操作的方法?我在 Ruby 和 Python 中看到了一些解决方案,但如果可以管理,我想要一个准系统解决方案。

@akhan 向 .gitignore 添加内容对 find 命令的 -empty 标志没有影响。我的评论是关于删除目录树中的 .DS_Store 文件,因此可以应用 -empty 标志。

解决方案8:

HuntsBot周刊–不定时分享成功产品案例,学习他们如何成功建立自己的副业–huntsbot.com

Andy Lester 是对的,但如果您的目录只是需要为空,而不是 empty 为空,您可以在其中放置一个空的 .gitignore 文件作为解决方法。

顺便说一句,这是一个实现问题,而不是基本的 Git 存储设计问题。正如 Git 邮件列表中多次提到的那样,之所以没有实施,是因为没有人足够关心为它提交补丁,而不是它不能或不应该完成。

解决方案9:

huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。

Ruby on Rails日志文件夹创建方式:

mkdir log && touch log/.gitkeep && git add log/.gitkeep

现在日志目录将包含在树中。它在部署时非常有用,因此您不必编写例程来创建日志目录。

可以通过发出将日志文件排除在外,

echo log/dev.log >> .gitignore

但你可能知道。

这与 Ruby on Rails 有什么关系?

@QuolonelQuestions github.com/rails/rails/blob/master/activerecord/test/migrations/…

它现在已重命名为 .keep github.com/rails/rails/blob/main/activerecord/test/migrations/…

解决方案10:

huntsbot.com – 高效赚钱,自由工作

Git 不跟踪空目录。有关详细说明,请参阅 Git FAQ。建议的解决方法是将 .gitignore 文件放在空目录中。我不喜欢那个解决方案,因为 .gitignore 被 Unix 约定“隐藏”了。也没有解释为什么目录是空的。

我建议在空目录中放一个 README 文件,解释为什么该目录是空的以及为什么需要在 Git 中对其进行跟踪。有了 README 文件,就 Git 而言,目录不再是空的。

真正的问题是为什么你需要 git 中的空目录?通常你有某种构建脚本可以在编译/运行之前创建空目录。如果没有,那就做一个。这比将空目录放在 git 中要好得多。

所以你有一些理由在 git 中需要一个空目录。把这个原因放在 README 文件中。这样其他开发人员(以及未来的你)就知道为什么需要有空目录。您还将知道,当需要空目录的问题解决后,您可以删除空目录。

要列出每个空目录,请使用以下命令:

find -name .git -prune -o -type d -empty -print

在每个空目录中创建占位符自述文件:

find -name .git -prune -o -type d -empty -exec sh -c \
  "echo this directory needs to be empty because reasons > {}/README.emptydir" \;

要忽略目录中除 README 文件之外的所有内容,请将以下行放入您的 .gitignore:

path/to/emptydir/*
!path/to/emptydir/README.emptydir
path/to/otheremptydir/*
!path/to/otheremptydir/README.emptydir

或者,您可以排除每个 README 文件被忽略:

path/to/emptydir/*
path/to/otheremptydir/*
!README.emptydir

要在创建后列出每个 README:

find -name README.emptydir

解决方案11:

huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式

警告:事实证明,这个调整并没有真正起作用。带来不便敬请谅解。

原帖如下:

我在玩 Git 内部时找到了一个解决方案!

假设您在存储库中。创建空目录: $ mkdir path/to/empty-folder 使用管道命令和空树 SHA-1 将其添加到索引中: $ git update-index --index-info 040000 tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904 path/to/empty-文件夹 键入命令,然后输入第二行。按 Enter,然后按 Ctrl + D 终止输入。注意:格式为模式 [SPACE] 输入 [SPACE] SHA-1hash [TAB] 路径(制表符很重要,答案格式不保留)。而已!您的空文件夹在您的索引中。你所要做的就是承诺。

这个解决方案很短,显然工作正常(见编辑!),但它不是那么容易记住…

可以通过创建一个新的空 Git 存储库来找到空树 SHA-1,将 cd 放入其中并发出 git write-tree,它会输出空树 SHA-1。

编辑:

自从我找到这个解决方案以来,我一直在使用它。它的工作方式似乎与创建子模块完全相同,只是没有在任何地方定义模块。这会在发出 git submodule init|update 时导致错误。问题是 git update-index 将 040000 tree 部分重写为 160000 commit。

此外,放置在该路径下的任何文件都不会被 Git 注意到,因为它认为它们属于某个其他存储库。这很讨厌,因为它很容易被忽视!

但是,如果您还没有(也不会)在存储库中使用任何 Git 子模块,并且“空”文件夹将保持为空,或者如果您希望 Git 知道它的存在并忽略它的内容,您可以使用这个调整。采用子模块的常规方式需要更多的步骤来进行调整。

将空文件夹放入索引并提交后,是否可以git svn dcommit获得所需的结果?

此调整不太可能与任何其他工具一起使用。就像警告和编辑中所述,我不鼓励使用它,除非在非常有限的情况下。

基于此,我创建了一个没有这些缺点的更好的解决方案:stackoverflow.com/a/58543445/277882

原文链接:https://www.huntsbot.com/qa/6Lda/how-do-i-add-an-empty-directory-to-a-git-repository?lang=zh_CN

一个优秀的自由职业者,应该有对需求敏感和精准需求捕获的能力,而huntsbot.com提供了这个机会

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要创建一个Git,你可以按照以下步骤进行操作: 1. 在本地选择一个合适的文件夹作为你的项目目录。 2. 打开命令行终端或Git Bash,并导航到你的项目目录。 3. 使用 `git init` 命令初始化一个空的Git。这将在当前目录下创建一个隐藏的`.git`文件夹,用于存储Git的版本控制信息。 4. 如果你已经有一个远程仓,可以使用 `git remote add origin <远程仓的URL>` 命令将其与本地仓关联。这样你就可以推送和拉取代码了。如果你还没有远程仓,可以在后续步骤中创建。 5. 添加你的项目文件到Git中。使用 `git add <文件名>` 命令将文件添加到暂存区,或使用 `git add .` 命令将所有文件添加到暂存区。 6. 使用 `git commit -m "<提交信息>"` 命令提交你的更改。提交信息应该清楚地描述你所做的更改。 7. 如果你还没有远程仓,可以在Git托管服务(如GitHubGitLab等)上创建一个新的远程仓。在创建仓后,会提供一个远程仓的URL。 8. 将本地仓的分支推送到远程仓。使用 `git push -u origin master` 命令将本地的master分支推送到远程仓。如果你的主分支不是master,可以将其替换为你的分支名称。 9. 现在你的Git已经创建成功,你可以在远程仓中查看代码并与团队成员共享。 这些步骤可以帮助你在本地和远程创建一个Git,并开始进行版本控制和协作开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值