4884

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

4

37 回答 37

4720

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

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

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

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

使@GreenAsJade的评论持久化:

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

于 2009-05-31T22:10:40.167 回答
1159

你不能。请参阅Git 常见问题解答

目前 git 索引(暂存区)的设计只允许列出文件,并且没有足够能力进行更改以允许空目录的人足够关心这种情况来补救它。

在目录中添加文件时会自动添加目录。也就是说,目录永远不必添加到存储库中,并且不会自行跟踪。

你可以说“ git add <dir>”,它会在那里添加文件。

如果您确实需要一个目录存在于结帐中,您应该在其中创建一个文件。.gitignore 很适合这个目的;您可以将其留空,或填写您希望在目录中显示的文件的名称。

于 2008-09-22T16:42:52.733 回答
957

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

于 2011-12-07T16:03:56.057 回答
508

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

于 2011-03-14T23:38:41.893 回答
454
touch .placeholder

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

或者,如另一个答案所述,该目录可以包含一个描述性README.md文件

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

于 2014-01-29T04:29:54.393 回答
346

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

第一件事:

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

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

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

一些建议的解决方法

许多用户建议:

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

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

  • 为什么你应该在你的项目中放置你可能并不真正想要的伪造文件或自述文件?
  • 为什么要使用与它的意义(不包括文件)完全相反的.gitignore事情(保存文件),即使它是可能的?

.gitkeep 方法

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

虽然看起来差别不大:

  • 您使用的文件用于保存文件夹。你不要放任何你不想放的信息。

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

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

  • 命名它.gitkeep可以使文件名本身(以及其他开发人员,这对于共享项目和 Git 存储库的核心目的之一有好处)非常清晰和直接,该文件是

    • 与代码无关的文件(因为前导点和名称)
    • 与 Git 明显相关的文件
    • 它的目的(保持)被清楚地陈述和一致并且在语义上是对立的,它的意思是忽略

采用

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

于 2013-12-04T23:32:56.110 回答
133

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

find . -type d -empty -exec touch {}/.gitignore \;
于 2011-05-03T15:17:52.883 回答
75

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

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

于 2008-09-22T17:28:41.297 回答
33

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

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

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

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

echo log/dev.log >> .gitignore

但你可能知道。

于 2012-10-22T13:24:59.057 回答
32

Git 不跟踪空目录。有关更多说明,请参阅Git 常见问题解答。建议的解决方法是将.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
于 2011-05-06T15:45:48.240 回答
31

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

原帖如下:

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

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

    $ mkdir path/to/empty-folder
    
  3. 使用管道命令和空树SHA-1将其添加到索引中:

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

    键入命令,然后输入第二行。按Enter,然后按Ctrl+D终止您的输入。注意:格式为模式[SPACE]输入[SPACE] SHA-1hash [TAB]路径(制表符很重要,答案格式不保留)。

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

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

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

编辑:

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

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

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

于 2012-01-20T15:50:07.760 回答
29

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

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

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

于 2008-10-08T00:13:30.887 回答
20

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

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

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

ln -sf .generated/bin bin
git add bin

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

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

如果您采用通常建议的方法来签入一个几乎是空的文件夹,那么在不删除“.gitignore”文件的情况下删除内容的复杂性很小。

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

.generated
于 2011-10-26T16:33:20.783 回答
17

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

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

但是,我们只有少数开发人员在 Mac 或 Linux 上工作。在 Windows 上做了很多工作,我找不到一个等效的简单单线来完成同样的工作。有些人很幸运因为其他原因安装了Cygwin,但仅仅为此开出 Cygwin 似乎有点过头了。

编辑以获得更好的解决方案

因此,由于我们的大多数开发人员已经安装了Ant,我首先想到的是将 Ant 构建文件放在一起,以独立于平台完成此任务。这仍然可以在这里找到

但是,后来我觉得把它做成一个小实用命令会更好,所以我用 Python 重新创建了它,并在这里发布到 PyPI 。您可以通过简单地运行来安装它:

pip3 install gitkeep2

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

$ gitkeep --help
Usage: gitkeep [OPTIONS] PATH

  Add a .gitkeep file to a directory in order to push them into a Git repo
  even if they're empty.

  Read more about why this is necessary at: https://git.wiki.kernel.org/inde
  x.php/Git_FAQ#Can_I_add_empty_directories.3F

Options:
  -r, --recursive     Add or remove the .gitkeep files recursively for all
                      sub-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 any
                      message provided
  -m, --message TEXT  A message to be included in the .gitkeep file, ideally
                      used to explain why it's important to push the specified
                      directory to source control even if it's empty.
  -v, --verbose       Print out everything.
  --help              Show this message and exit.

希望对你有帮助。

于 2017-05-15T19:08:13.977 回答
16

你不能,不幸的是永远也不能。这是 Linus Torvald 自己做出的决定。他知道什么对我们有好处。

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

我找到了Re: Empty directory..,但也许还有另一个。

你必须忍受这些变通方法......不幸的是。

于 2015-03-15T18:17:02.073 回答
15

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

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

看看:http ://code.google.com/p/markemptydirs

于 2009-07-23T22:33:06.180 回答
12

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

于 2008-09-24T06:43:41.067 回答
11

阅读@ofavre@stanislav-bashkyrtsev的答案,使用损坏的 GIT 子模块引用来创建 GIT 目录,我很惊讶没有人建议对这个想法进行简单的修改,以使整个事情变得理智和安全:

与其将假子模块侵入 GIT,不如添加一个空的真实子模块。

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

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

commit e84d7b81f0033399e325b8037ed2b801a5c994e0
Author: 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,因此您必须在添加 repo 后手动检查参考提交 ID 是否正在e84d7b81f0033399e325b8037ed2b801a5c994e0使用。git submodule status

仍然不是原生解决方案,但我们可能拥有最好的解决方案,而无需有人真正非常肮脏地使用 GIT 代码库。

附录:重新创建此提交

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

# Initialize new GIT repository
git 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 commit
git commit --allow-empty --allow-empty-message --no-edit

创建可重现的 GIT 提交非常困难……</p>

于 2019-10-24T14:23:54.563 回答
11

这个解决方案对我有用。

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

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

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

git rm -r --cached .
git add . // or git stage .
git commit -m ".gitignore fix"
git push
于 2020-09-03T15:04:54.130 回答
10

如前所述,不可能添加空目录,但这是一个将空 .gitignore 文件添加到所有目录的衬里。

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

为了方便访问,我将它保存在 Rakefile 中。

于 2011-04-19T14:10:35.610 回答
10

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

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

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

另一个想法是添加一个README文件来解释目录的用途。

于 2015-04-26T22:54:56.663 回答
10

许多人已经回答了这个问题。只需在此处添加 PowerShell 版本。

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

在其中添加一个空的 .gitkeep 文件

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}
于 2019-08-13T09:34:58.043 回答
9

Jamie Flournoy 的解决方案效果很好。这是一个有点增强的版本,以保持.htaccess

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

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

于 2014-06-22T13:06:30.117 回答
8

我总是构建一个函数来检查我想要的文件夹结构并在项目中为我构建它。这解决了这个问题,因为空文件夹由代理保存在 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 中,但我确信大多数语言都支持相同的功能,并且由于文件夹的创建由应用程序负责,因此文件夹将始终存在。

于 2011-04-04T10:06:02.050 回答
8

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

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

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

致命:不是有效的对象名称 b64338b90b4209263b50244d18278c0999867193

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

于 2014-12-24T10:24:24.703 回答
8

如果您想添加一个文件夹,该文件夹将在多个语义目录中容纳大量临时数据,那么一种方法是将类似这样的内容添加到您的根 .gitignore ...

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

然后,您可以在每个目录中提交描述性 README.md 文件(或空白文件,只要您可以像*.md在这种情况下一样唯一地定位它们),以确保这些目录都保留在 repo 中,但文件(带扩展名)被忽略。LIMITATION: .'s 不允许在目录名称中!

您可以使用 xml/images 文件或其他任何内容填充所有这些目录,并/app/data/随着应用程序的存储需求的发展而随着时间的推移添加更多目录(README.md 文件用于刻录每个存储目录的用途的描述)确切地)。

无需通过为每个新目录.gitignore创建一个新目录来进一步改变您的或去中心化。.gitignore可能不是最聪明的解决方案,但在 gitignore 方面很简洁,并且总是对我有用。又好又简单!;)

在此处输入图像描述

于 2017-05-11T13:36:46.220 回答
7

有时您必须处理糟糕的编写库或软件,它们需要一个“真正的”空目录和现有目录。放一个简单的.gitignore.keep可能会破坏它们并导致错误。在这些情况下,以下内容可能会有所帮助,但不能保证......

首先创建需要的目录:

mkdir empty

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

ln -s .this.directory empty/.keep

要忽略此目录中的文件,您可以将其添加到您的根目录中.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 文件系统......)

于 2016-06-02T16:42:50.527 回答
7

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

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

于 2019-06-17T05:03:37.373 回答
7

在该目录中添加一个 .gitkeep 文件并提交它。

touch .gitkeep 

它是 git 遵循的标准。

于 2021-12-01T11:20:15.477 回答
5

为战斗增加了一个选项。

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

如前所述,格式为:

*
!.gitignore

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

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

我自己,我有一个用来执行此操作的 shell 脚本。随意命名脚本,然后将其添加到包含路径中的某个位置,或直接引用它:

#!/bin/bash

dir=''

if [ "$1" != "" ]; then
    dir="$1/"
fi

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

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

$ ignore_dir ./some/directory

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

您的.gitignore文件如下所示:

!.gitignore

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

我建议在文件中保留这一行的原因是它给出了.gitignore目的。否则,有些人可能会考虑将其删除。如果您在该行上方添加评论可能会有所帮助。

于 2016-05-26T01:18:52.723 回答
4

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

于 2008-09-22T19:50:38.320 回答
3

您可以将此代码保存为 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
于 2011-06-26T22:41:27.070 回答
3

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

例如,如果你想跟踪空目录/project/content/posts然后创建新的空文件/project/content/posts/.gitignore

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

在此处输入图像描述

于 2020-11-21T14:24:29.907 回答
2

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

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

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

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

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

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

*
!.gitignore

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

于 2016-07-11T18:36:20.517 回答
2

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

# 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
于 2019-10-22T18:46:12.633 回答
1

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

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

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

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

git add new_folder/some_file

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

于 2019-11-20T02:21:23.550 回答
-6

只需添加 areadme或 a.gitignore然后删除它,而不是从终端,从 github 网站,这将给出一个空的存储库

于 2020-09-10T03:04:07.817 回答