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

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

1369645 次浏览

你不能。看git常见问题

目前git索引的设计(暂存区)只允许文件被列入名单,没有人有足够的能力进行更改以允许空目录已经足够关心#36825;来弥补这一点

自动添加目录在其中添加文件时。那就是永远不需要添加目录到存储库,并且没有被跟踪靠自己

你可以说"git add <dir>"将在那里添加文件。

如果你真的需要一个目录存在于结帐中,您应该创建一个文件在其中。. gitignore适用于这个目的;你可以让它空着,或填写您的文件名希望在目录中显示。

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

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

不能。这是Git维护者有意为之的设计决定。基本上,像Git这样的源代码管理系统的目的是管理源代码,空目录不是源代码。Git也经常被描述为内容跟踪器,同样,空目录没有内容(实际上恰恰相反),所以它们不会被跟踪。

当您添加.gitignore文件时,如果您要在其中放置任何数量的内容(您希望Git忽略),您可能希望添加只有星号*的单行,以确保您不会意外添加被忽略的内容。

假设您需要一个名为tmp的空目录:

$ mkdir tmp$ touch tmp/.gitignore$ git add tmp$ echo '*' > tmp/.gitignore$ git commit -m 'Empty directory' tmp

换句话说,您需要将. gitignore文件添加到索引中,然后才能告诉Git忽略它(以及空目录中的所有其他内容)。

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

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

然后,您不必像在m104的解决方案中那样获得正确的订单。

这也提供了一个好处,即当您执行git状态时,该目录中的文件不会显示为“未跟踪”。

使@陈志立的注释持久化:

我认为值得注意的是,这个解决方案恰恰满足了问题的要求,但也许不是许多关注这个问题的人一直在寻找的。这个解决方案保证目录保持为空。它说“我真的不想在这里签入文件”。而不是“我这里没有任何文件要签入,但我需要这里的目录,文件可能会稍后出现”。

我也遇到了空目录的问题。使用占位符文件的问题是,如果不再需要它们,您需要创建它们并删除它们(因为后来添加了子目录或文件)。使用大型源代码树管理这些占位符文件可能很麻烦且容易出错。

这就是为什么我决定编写一个开源工具,它可以自动管理此类占位符文件的创建/删除。它是为. NET平台编写的,在Mono(. NET forLinux)和Windows下运行。

只看一眼:http://code.google.com/p/markemptydirs

您总是可以在目录中放置一个README文件,并解释为什么要在存储库中使用这个(否则为空的)目录。

我总是构建一个函数来检查我想要的文件夹结构并在项目中为我构建它。这解决了这个问题,因为空文件夹由代理保存在Git中。

function check_page_custom_folder_structure () {if (!is_dir(TEMPLATEPATH."/page-customs"))mkdir(TEMPLATEPATH."/page-customs");if (!is_dir(TEMPLATEPATH."/page-customs/css"))mkdir(TEMPLATEPATH."/page-customs/css");if (!is_dir(TEMPLATEPATH."/page-customs/js"))mkdir(TEMPLATEPATH."/page-customs/js");}

这是在PHP中,但我相信大多数语言都支持相同的功能,并且由于文件夹的创建由应用程序负责,因此文件夹将始终存在。

如前所述,无法添加空目录,但这里有一个将空. gitignore文件添加到所有目录的行。

ruby -e 'require "fileutils" ; Dir.glob(["target_directory","target_directory/**"]).each { |f| FileUtils.touch(File.join(f, ".gitignore")) if File.directory?(f) }'

我已经把这个在Rakefile方便访问。

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

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

太长别读:在目录中添加一个文件,它将被git跟踪。

但我建议改为:让构建脚本或部署脚本在现场创建目录。


更多解释:

Git不跟踪空目录。有关更多详细信息,请参阅官方git常见问题。建议的解决方法是在空目录中放置一个.gitignore文件。文件到位后,目录不再为空,将由git跟踪。

我不喜欢这种变通方法。文件.gitignore旨在忽略某些事情。在这里,它用于相反的目的:保留某些东西而不是忽略某些东西。

一个常见的解决方法是将文件命名为.gitkeep。这至少传达了文件名的意图。这似乎也是一些项目之间的共识。Git本身并不关心文件的名称。它只关心目录是否为空。

.gitkeep.gitignore都有一个问题:文件被unix约定隐藏。一些工具,如lscp dir/*会假装文件不存在,并表现得好像目录是空的。其他工具,如find -empty不会。新手unix用户可能会在这方面感到困惑。经验丰富的unix用户会推断存在隐藏文件并检查它们。无论如何;这是一种可以避免的烦恼。

解决“隐藏问题”的一个简单方法是将文件命名为gitkeep(没有前导点)。我们可以更进一步,将文件命名为README。然后,在文件中,解释为什么该目录需要为空并在git中跟踪。这样其他开发人员(以及未来的您)就可以了解事情的原因。

摘要:将文件放在目录中,现在git会跟踪(以前为空)目录。


潜在问题:目录不再为空。

如果您的工作流只需要一个现有目录,可能会转储其中的文件,那么没问题(还)。但是如果您想进一步处理文件,那么可能会出现问题。因为在目录中不仅有您想要的文件,而且还有一个流氓.gitkeepREADME或您拥有的文件。这可能会使简单的bash结构复杂化,例如for file in dirname/*,因为您需要排除或特例额外的文件。

相反,如果您的工作流需要一个真正空目录,那么您肯定有问题,因为该目录不再为空。

Git不想跟踪空目录。通过尝试让git跟踪空目录,您牺牲了您试图保留的东西:空目录。


让我们后退几步。在您询问如何使git跟踪空目录之前。

您当时遇到的情况可能如下:您有一个需要空目录才能工作的工具。您想部署/分发此工具,并且您希望也部署空目录。问题:git不跟踪空目录。

现在,与其尝试让git跟踪空目录,不如探索其他选项。也许(希望如此)您有一个部署脚本。让部署脚本在git克隆后创建目录。或者您有一个构建脚本。让构建脚本在编译后创建目录。或者甚至可以修改工具本身以在使用前检查和创建目录。

如果该工具旨在供人类在不同环境中使用,那么我会让工具本身检查并创建目录。如果您无法修改工具,或者该工具以高度自动化的方式使用(docker容器部署、工作、销毁),那么部署脚本将是创建目录的好地方。

我认为这是解决问题的更明智的方法。构建脚本和部署脚本旨在为运行程序做好准备。您的工具需要一个空目录。因此使用这些脚本创建空目录。

好处:当即将使用时,目录几乎可以保证为空。此外,其他开发人员(以及未来的您)不会偶然发现存储库中的“空”目录并想知道为什么它需要在那里。

当然,构建脚本中的mkdir可能会像任何其他代码行一样腐烂。但这是开发中固有的问题。而虚假的“空”目录是一个可以避免的人工问题。

太长别读:让构建脚本或部署脚本在现场创建空目录。或者让工具本身在使用前检查并创建目录。


一个人去很危险。听从这些命令。

列出每个空目录:

find -type d -empty

相同,但避免在.git目录中查找:

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

如果您继承了包含“空”目录的项目,以下命令可能会对您有所帮助。

列出包含名为.gitkeep的文件的每个目录:

find -type f -name .gitkeep

列出每个目录及其包含的文件数:

find -type f -printf "%h\n" | sort | uniq -c | sort -n

现在您可以检查所有仅包含一个文件的目录并检查它是否是“git保持”文件。请注意,此命令不会列出真正为空的目录。

您可以将此代码保存为create_readme.php并从Git项目的根目录运行php代码。

php create_readme.php

它会将README文件添加到所有空目录,以便将这些目录添加到索引中。

<?php$path = realpath('.');$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path),       RecursiveIteratorIterator::SELF_FIRST);foreach($objects as $name => $object){if ( is_dir($name) && ! is_empty_folder($name) ){echo "$name\n" ;exec("touch ".$name."/"."README");}}
function is_empty_folder($folder) {$files = opendir($folder);while ($file = readdir($files)) {if ($file != '.' && $file != '..')return true; // Not empty}}?>

那就去做

git commit -m "message"git push

也许添加一个空目录看起来像是最小阻力路径,因为您有脚本期望该目录存在(也许是因为它是生成二进制文件的目标)。另一种方法是根据需要修改脚本以创建目录

mkdir --parents .generated/bin ## create a folder for storing generated binariesmv myprogram1 myprogram2 .generated/bin ## populate the directory as needed

在此示例中,您可以签入指向该目录的(损坏的)符号链接,以便您可以在没有“.生成”前缀的情况下访问它(但这是可选的)。

ln -sf .generated/bin bingit add bin

当你想清理你的源代码树时,你可以:

rm -rf .generated ## this should be in a "clean" script or in a makefile

如果您采用经常建议的方法签入几乎为空的文件夹,则删除内容而不删除“. gitignore”文件的复杂性很小。

您可以通过将以下内容添加到root. gitignore来忽略所有生成的文件:

.generated

在目录中创建一个名为.gitkeep的空文件,并将其git add

默认情况下,这将是类Unix系统上的隐藏文件,但它将强制Git确认目录的存在,因为它现在有内容。

另请注意,此文件的名称没有什么特别之处。您可以将其命名为任何您想要的名称。Git关心的只是文件夹中包含一些内容。

警告:这个调整并没有真正奏效。抱歉给您带来不便。

原文如下:

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

  1. 假设您在您的存储库中。
  2. 创建空目录:

    $ mkdir path/to/empty-folder
  3. Add it to the index using a plumbing command and the empty tree SHA-1:

    $ git update-index --index-info040000 tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904    path/to/empty-folder

    键入命令,然后输入第二行。按输入,然后按Ctrl+D终止输入。注意:格式是模式[SPACE]类型[SPACE]SHA-1hash[标签]路径(选项卡很重要,答案格式不会保留它)。

  4. 就是这样!您的空文件夹在您的索引中。您所要做的就是提交。

这个解决方案很短,显然效果很好(看编辑!),但不容易记住。

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

编辑:

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

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

但是,如果您还没有(并且不会)使用存储库中的任何Git子模块,并且“空”文件夹将保持为空,或者如果您希望Git知道它的存在并忽略其内容,您可以进行此调整。

ruby on rails日志文件夹创建方式:

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

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

日志文件可以通过发出,

echo log/dev.log >> .gitignore

但你可能知道。

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

第一件事:

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

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

  • 脚手架预定义文件夹结构,使其可供存储库的每个用户/贡献者使用;或者,作为上述的特殊情况,为临时文件创建一个文件夹,例如cache/logs/目录,我们希望在其中提供文件夹,但.gitignore其内容
  • 与上述内容相关,一些项目没有文件夹就不行(这通常是一个设计不佳的项目的暗示,但这是一个常见的现实场景,可能会有权限问题需要解决)。

一些建议的变通办法

许多用户建议:

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

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

  • 为什么要在项目中放置您可能并不真正想要的虚假文件或README?
  • 为什么使用.gitignore来做一件与它的含义(不包括文件)完全相反的事情(保持文件),即使它是可能的?

. git保持方法

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

虽然看起来没有那么大的区别:

  • 您使用的文件具有保留文件夹的单一目的。您不会在那里放置任何您不想放置的信息。

    例如,您应该将READMEs用作包含有用信息的READMEs,而不是作为保留文件夹的借口。

    关注点分离总是一件好事,您仍然可以添加.gitignore来忽略不需要的文件。

  • 将其命名为.gitkeep使文件名本身(以及给其他开发者,这对共享项目和Git存储库的核心目的之一很有好处)非常清楚和直接

    • 与代码无关的文件(由于前导点和名称)
    • 一个明显与Git相关的文件
    • 它的目的(保持)是明确的,一致的,语义上与忽略相反

收养

我已经看到.gitkeep方法被laravelAngular-CLI等非常重要的框架所采用。

touch .placeholder

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

或者,如另一个回答该目录可以包含一个描述性的#0文件所指出的。

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

Jamie Flournoy的解决方案工作得很好。这是一个有点增强的版本来保持.htaccess

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

使用此解决方案,您可以提交一个空文件夹,例如/log/tmp/cache,并且该文件夹将保持为空。

这是一个hack,但有趣的是它有效(Git 2.2.1)。类似于@Teka的建议,但更容易记住:

  • 将子模块添加到任何存储库(git submodule add path_to_repo
  • 这将添加一个文件夹和一个文件.submodules。提交更改。
  • 删除.submodules文件并提交更改。

现在,您有一个在签出提交时创建的目录。有趣的是,如果您查看此文件的树对象的内容,您将获得:

致命:不是有效的对象名称b 64338 b 90 b 4209263 b 50244 d 18278 c 0999867193

不过,我不鼓励使用它,因为它可能会在Git的未来版本中停止工作。这可能会使您的存储库损坏。

你做不到,不幸的是,你永远也做不到。这是莱纳斯·托瓦尔德自己做出的决定。他知道什么对我们有好处。

有一个咆哮的地方我读过一次。

我找到了Re:空目录…,但也许还有另一个。

不幸的是,你必须忍受变通办法。

没有办法让Git跟踪目录,所以唯一的解决方案是在您希望Git跟踪的目录中添加一个占位符文件。

该文件可以命名并包含您想要的任何内容,但大多数人使用名为.gitkeep的空文件(尽管有些人更喜欢与VCS无关的.keep)。

前缀.将其标记为隐藏文件。

另一个想法是添加一个README文件,解释该目录将用于什么。

为战斗增加了一个选择。

假设您想向git添加一个目录,对于与git相关的所有目的,该目录应保持为空并且永远不会跟踪其内容,这里多次建议的.gitignore将起到作用。

如上所述,格式是:

*!.gitignore

现在,如果您想在命令行中一举完成此操作,而要添加的目录里面,您可以执行:

$ echo "*" > .gitignore && echo '!.gitignore' >> .gitignore && git add .gitignore

我自己,我有一个外壳脚本,我用它来做这件事。命名你想要的脚本,要么将其添加到包含路径的某个地方,要么直接引用它:

#!/bin/bash
dir=''
if [ "$1" != "" ]; thendir="$1/"fi
echo "*" > $dir.gitignore && \echo '!.gitignore' >> $dir.gitignore && \git add $dir.gitignore

有了这个,你可以从你想要添加的目录中执行它,或者引用该目录作为它的第一个也是唯一的参数:

$ ignore_dir ./some/directory

另一种选择(回应@GreenAsJade的评论),如果您将来想要跟踪五月包含跟踪文件的空文件夹,但现在将为空,您可以从.gitignore文件中省略*,并将签入。基本上,所有文件都在说“不要忽略”,但除此之外,目录为空并被跟踪。

您的.gitignore文件看起来像:

!.gitignore

就是这样,签入,你有一个空的,但跟踪,目录,您可以在以后的某个时间跟踪文件。

我建议在文件中保留这一行的原因是它提供了.gitignore的目的。否则,行下的某个人可能会想删除它。如果您在行上放置注释可能会有所帮助。

有时你必须处理糟糕的书面库或软件,它们需要一个“真正的”空目录和现有目录。放一个简单的.gitignore.keep可能会破坏它们并导致bug。

首先创建所需的目录:

mkdir empty

然后向该目录添加一个损坏的符号链接(但在上面描述的用例之外的任何其他情况下,请使用README并给出解释):

ln -s .this.directory empty/.keep

要忽略此目录中的文件,您可以将其添加到root.gitignore中:

echo "/empty" >> .gitignore

要添加忽略的文件,请使用参数强制它:

git add -f empty/.keep

提交后,你的索引中有一个损坏的符号链接,git创建了该目录。断开的链接有一些优势,因为它不是普通文件并且指向没有普通文件。所以它甚至符合问题“(包含没有文件)”的部分,不是意图,而是含义,我想:

find empty -type f

此命令显示一个空结果,因为该目录中没有文件。因此,大多数获取目录中所有文件的应用程序通常看不到此链接,至少如果它们执行“文件存在”或“可读”。甚至一些脚本在那里找不到任何文件:

$ php -r "var_export(glob('empty/.*'));"array (0 => 'empty/.',1 => 'empty/..',)

但我强烈建议仅在特殊情况下使用此解决方案,在空目录中编写好的README通常是更好的解决方案。(我不知道这是否适用于windows文件系统…)

有时我有存储库的文件夹,这些文件夹只会包含被认为是“内容”的文件-也就是说,它们不是我关心的版本化文件,因此永远不应该提交。使用Git的. gitignore文件,您可以忽略整个目录。但有时在存储库中拥有该文件夹会是有益的。这是满足这一需求的绝佳解决方案。

我过去所做的是将. gitignore文件放在我的repo的根目录中,然后排除该文件夹,如下所示:

/app/some-folder-to-exclude/another-folder-to-exclude/*

但是,这些文件夹不会成为repo的一部分。您可以在其中添加类似README文件的内容。但是您必须告诉您的应用程序不要担心处理任何README文件。

如果您的应用程序依赖于文件夹(虽然是空的),您可以简单地将. gitignore文件添加到相关文件夹中,并使用它来实现两个目标:

告诉Git文件夹中有一个文件,这使得Git将其添加到存储库中。告诉Git忽略此文件夹的内容,减去此文件本身。这是要放入空目录中的. gitignore文件:

*!.gitignore

第一行(*)告诉Git忽略此目录中的所有内容。第二行告诉Git不要忽略. gitignore文件。您可以将此文件填充到要添加到存储库的每个空文件夹中。

如果您想添加一个将在多个语义目录中容纳大量瞬态数据的文件夹,那么一种方法是将类似的内容添加到您的root. gitignore…

/app/data/**/*. */app/data/**/*. md

然后,您可以在每个目录中提交描述性README.md文件(或空白文件,没关系,只要您可以唯一地定位它们,就像在这种情况下使用*.md一样),以确保目录都仍然是存储库的一部分,但文件(带扩展名)被忽略。限制:目录名称中不允许使用.

您可以使用xml/图像文件或其他文件填充所有这些目录,并随着时间的推移在/app/data/下添加更多目录,以满足应用程序开发的存储需求(README.md文件用于刻录每个存储目录的确切用途)。

没有必要通过为每个新目录创建一个新的.gitignore来进一步改变你的.gitignore或去中心化。可能不是最聪明的解决方案,但简洁的gitignore明智,总是适合我。不错,简单!;)

在此处输入图片描述

我喜欢答案由artur79和mjs,所以我一直在使用两者的组合,并将其作为我们项目的标准。

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

然而,我们只有少数开发人员在Mac或Linux上工作。在Windows上做了很多工作,我找不到一个类似的简单单行程序来完成同样的工作。有些人很幸运,因为其他原因安装了Cygwin,但为此开出Cygwin处方似乎有些矫枉过正。

所以,由于我们的大多数开发人员已经安装了蚂蚁,我想到的第一件事就是整理一个ant构建文件来独立于平台完成此操作。这仍然可以找到这里

然而,最好将其制作成一个小型实用程序命令,所以我使用Python重新创建了它并将其发布到PyPI这里。您可以通过简单地运行来安装它:

pip3 install gitkeep2

它将允许您递归地创建和删除.gitkeep文件,它还允许您向它们添加消息,以便您的同行了解为什么这些目录很重要。最后一点是奖励。我认为如果.gitkeep文件可以自我记录会很好。

$ gitkeep --helpUsage: gitkeep [OPTIONS] PATH
Add a .gitkeep file to a directory in order to push them into a Git repoeven if they're empty.
Read more about why this is necessary at: https://git.wiki.kernel.org/index.php/Git_FAQ#Can_I_add_empty_directories.3F
Options:-r, --recursive     Add or remove the .gitkeep files recursively for allsub-directories in the specified path.-l, --let-go        Remove the .gitkeep files from the specified path.-e, --empty         Create empty .gitkeep files. This will ignore anymessage provided-m, --message TEXT  A message to be included in the .gitkeep file, ideallyused to explain why it's important to push the specifieddirectory to source control even if it's empty.-v, --verbose       Print out everything.--help              Show this message and exit.

一种简单的方法是将.gitkeep文件添加到您希望(当前)保持为空的目录中。

有关更多信息,请参阅此SOF答案-这也解释了为什么有些人发现添加. gitignore文件的竞争约定(如此处的许多答案所述)令人困惑。

APowerShell版本:

查找目录中的所有空文件夹

在那里添加一个空的. git保持文件

Get-ChildItem 'Path to your Folder' -Recurse -Directory | Where-Object {[System.IO.Directory]::GetFileSystemEntries($_.FullName).Count -eq 0} | ForEach-Object { New-Item ($_.FullName + "\.gitkeep") -ItemType file}

要将Jamie Flournoy的解决方案扩展到目录树,您可以将此. gitignore文件放在顶级目录中,将touch .keepdir放在Git应该跟踪的每个子目录中。所有其他文件都将被忽略。这对于确保构建目录的结构一致很有用。

# Ignore files but not directories. * matches both files and directories# but */ matches only directories. Both match at every directory level# at or below this one.*!*/
# Git doesn't track empty directories, so track .keepdir files, which also# tracks the containing directory.!.keepdir
# Keep this file and the explanation of how this works!.gitignore!Readme.md

阅读ofavre的斯坦尼斯拉夫-巴什基尔采夫的回答使用损坏的Git子模块引用来创建Git目录,我很惊讶还没有人提出这个简单的想法修正案,以使整个事情变得理智和安全:

而不是将伪造的子模块入侵Git,只是添加一个空的真正的

输入:https://gitlab.com/empty-repo/empty.git

一个只有一次提交的Git存储库:

commit e84d7b81f0033399e325b8037ed2b801a5c994e0Author: Nobody <none>Date: Thu Jan 1 00:00:00 1970 +0000

没有消息,没有提交的文件。

用法

要将空目录添加到您的GIT存储库:

git submodule add https://gitlab.com/empty-repo/empty.git path/to/dir

要将所有现有的空目录转换为子模块:

find . -type d -empty -delete -exec git submodule add -f https://gitlab.com/empty-repo/empty.git \{\} \;

Git会在创建子模块引用时存储最新的提交哈希,所以你不必担心我(或GitLab)使用它来注入恶意文件。不幸的是,我没有找到任何方法来强制在结帐时使用哪个提交ID,所以你必须在添加存储库后使用git submodule status手动检查引用提交ID是否为e84d7b81f0033399e325b8037ed2b801a5c994e0

仍然不是原生解决方案,但最好的解决方案可能是没有人在GIT代码库中弄脏他们的手真的真的

附录:重新创建此提交

您应该能够使用(在空目录中)重新创建此确切的提交:

# Initialize new GIT repositorygit init
# Set author data (don't set it as part of the `git commit` command or your default data will be stored as “commit author”)git config --local user.name "Nobody"git config --local user.email "none"
# Set both the commit and the author date to the start of the Unix epoch (this cannot be done using `git commit` directly)export GIT_AUTHOR_DATE="Thu Jan 1 00:00:00 1970 +0000"export GIT_COMMITTER_DATE="Thu Jan 1 00:00:00 1970 +0000"
# Add root commitgit commit --allow-empty --allow-empty-message --no-edit

创建可复制的Git提交是非常困难的…

我搜索这个问题是因为:我创建了一个新目录,它包含许多文件。在这些文件中,有些我想添加到Git存储库,有些不想。但是当我做“git状态”时。它只显示:

Untracked files:(use "git add <file>..." to include in what will be committed)../trine/device_android/

它没有列出这个新目录中的单独文件。然后我想也许我可以只添加这个目录,然后处理单独的文件。所以我用谷歌搜索“只添加目录”。

在我的情况下,我发现我可以在新目录中添加一个文件,我确信我想将其添加到Git。

git add new_folder/some_file

在此之后,“git状态”将显示单独文件的状态。

这个解决方案为我工作。

1.将.gitignore文件添加到空目录:

**/!.gitignore
  • *忽略文件夹中的所有文件
  • */忽略子目录
  • !.gitignore包含. gitignore文件

2.然后删除缓存,暂存文件,提交并推送:

git rm -r --cached .git add . // or git stage .git commit -m ".gitignore fix"git push

只需添加readme.gitignore文件,然后从GitHub网站删除它,但不是从终端删除它。这将给出一个空的存储库。

只需在要跟踪的空目录中添加一个空(没有内容). gitignore文件。

例如,如果要跟踪空目录/project/content/posts,则创建一个新的空文件/project/content/posts/.gitignore

注意:. git保持不是官方git的一部分:

在此输入图片描述

在空目录中添加. git保持文件并提交。

touch .gitkeep

这是Git遵循的标准。