.gitignore和.gitkeep有什么区别?

Mat*_*tty 1776 git gitignore

.gitignore和之间有什么区别.gitkeep?它们是不同名称的同一个东西,还是它们都起着不同的作用?我似乎无法找到很多文档.gitkeep.

Woo*_*ble 3179

.gitkeep 没有记录,因为它不是Git的功能.

Git 无法添加一个完全空的目录.想要在Git中跟踪空目录的人已经创建了放置.gitkeep在这些目录中调用的文件的约定.该文件可以被称为任何东西; Git对此名称没有特别的意义.

有一个竞争的惯例是将.gitignore文件添加到空目录以跟踪它们,但有些人认为这令人困惑,因为目标是保留空目录,而不是忽略它们; .gitignore还用于列出Git在查找未跟踪文件时应忽略的文件.

  • @tamouse很多次,空目录的路径(例如文件夹的名称)足以表达它的目的(例如:模板/缓存,上传/拇指等).在这些情况下,将自述文件放入其中每个都感觉多余. (387认同)
  • 将`README`文件放在另外的空子目录中是不是更好的解决方案,该子目录包含有关该子目录将用于什么的一些信息?有一个名为`.gitkeep`的文件实际上并不是git的一部分,这似乎令人困惑. (370认同)
  • 值得注意的是,流行的Rails框架使用`.keep`文件而不是`.gitkeep`稍微改变了这个约定,以保留这些空文件夹,因为git不是唯一不跟踪空文件夹的源控制系统.更多细节:https://github.com/rails/rails/issues/2800 (56认同)
  • @tamouse,@ tomouse:一个带有两行的`.gitignore`文件:`*`和`!.gitignore`足以清晰地传达正在发生的事情.如果需要更多详细说明,请使用`#`语法在文件顶部添加注释. (30认同)
  • 想要跟踪空目录的人应该在README中指示必须创建目录或使用他们的构建工具或任何需要该目录存在的工具创建目录; / (14认同)
  • 我觉得我们在这里讨论的有两个用例.如果有一个文件夹最终会充满跟踪的项目,`.gitkeep`比`.gitignore`更有意义,因为你没有忽略任何东西,你只是把文件夹放在那里.但是,如果文件夹_ever_将要跟踪其中的文件,忽略这些文件的`.gitignore`最有意义. (11认同)
  • 我只是调用我的文件`.empty`.我想这更有意义,至少对我而言. (7认同)
  • 我同意@Droogans.我不相信```.gitignore```令人困惑.恰恰相反,它意味着您要保留文件夹并忽略其内容.```.gitkeep```不会意外地阻止对一次性文件进行版本控制. (6认同)
  • 我的发布工程师在一些目录中添加了README,以便跟踪这些目录.如果不删除README文件,Android项目将不会构建...只是一个FYI ...... (4认同)
  • 翔实.我期待着.gitkeep标记你想保留的那些.gitignore文件,与另一个.gitignore'trash'不同,它应该/可以在分支结账后删除. (3认同)
  • 放置`README`文件的@tamouse是让git跟踪空文件夹的最佳解决方案. (3认同)
  • 就个人来说,一个名为.gitkeep的文件里面有文字(正如在自述文件中找到的)对我来说最有意义.一旦你知道约定,名字.gitkeep就会很明显,然后你可以在好奇心来袭时打开文件.自述文件假设过于笼统. (3认同)
  • `.keep`也是更通用的空文件,不是git特有的。我用它,看看周围。 (3认同)
  • 如果我在目录中看到自述文件,那么我将其删除而不是来到这里。 (3认同)
  • @pardeep请仔细阅读答案。.gitkeep实际上什么也不做。git不会读取其内容来决定要保留的内容,它只会将文件作为常规文件进行跟踪。 (2认同)
  • 正如@TerNovi 所暗示的那样,自述文件容易干扰自动化。使用隐藏的 `.files` 应该优先于无关的 README 文件。 (2认同)
  • @Mig82你应该将你的工具称为“git-keep”,而不是“gitkeep”,因为这样git可以自动找到它。它在 $PATH 中查找以“git-”开头的工具,后跟您使用的命令,即“git keep path/to/dir”。这就是编写 git 扩展的方式。 (2认同)

sja*_*jas 298

.gitkeep只是一个占位符.一个虚拟文件,所以git不会忘记该目录,因为git只跟踪文件.


如果你想要一个空目录并确保它对git保持"干净",请在.gitignore其中创建一个包含以下行:

# .gitignore sample
###################

# Ignore all files in this dir...
*

# ... except for this one.
!.gitignore
Run Code Online (Sandbox Code Playgroud)

如果您希望git只能看到一种类型的文件,下面是一个如何过滤所有.txt文件的示例,除了.gitignore和所有文件:

# .gitignore to keep just .txt files
###################################

# Filter everything...
*

# ... except the .gitignore...
!.gitignore

# ... and all text files.
!*.txt
Run Code Online (Sandbox Code Playgroud)

('#'表示评论.)

  • 从您的链接:`由于git ignore文件已经在repo中,因此没有必要忽略它 - 它已经被跟踪了.------如果不是,那么你没有强行添加,你可能会忘记它.在琐碎的情况下,没有问题,但如果它是一个更大的文件,你可能会感到不安.使用`!.gitignore`可以防止你在脚下射击.我更喜欢它,过去曾烧过自己. (13认同)
  • @Will - 不,`!`否定了以下部分,就像在编程中一样. (7认同)
  • 我自己喜欢这种做法.如果这些目录中有源代码,则不需要.gitkeep和一般的临时/缓存/用户内容,无论如何都会生成测试期间导致您还必须.gitignore这些文件 (3认同)
  • 没有必要将`!.gitignore`放在git ignore文件中,要么添加文件然后编辑它,要么强制添加适当的内容("*"忽略所有内容,或者只是确保文件夹存在) [进一步的例子](https://github.com/h5bp/html5-boilerplate/commit/875df4e9b598b869e52bd081a080419d30913930). (3认同)

Jim*_*nro 119

.gitignore
Run Code Online (Sandbox Code Playgroud)

是一个文本文件,包含目录中的文件列表,git将忽略或不在存储库中添加/更新.

.gitkeep
Run Code Online (Sandbox Code Playgroud)

由于git删除或不添加空目录到repo .gitkeep是一种黑客(我不认为它被正式命名为git的一部分)在repo中保留空目录.

touch /path/to/emptydirectory/.gitkeep需要添加文件即可,git现在可以在存储库中维护此目录.

  • 如果你不想每次都指定每个文件夹的完整路径,你可以拥有任意数量的.gitignore. (17认同)
  • .gitkeep不能像.gitignore一样工作。这不是要保留的目录列表。它只是一个空文件,位于您想保留的目录中。可以将其命名为任何您想要的.keep等。因此,您可以拥有/ foo / bar之类的目录,而gitkeep文件将为/foo/bar/.gitkeep (2认同)

小智 6

许多人喜欢使用只是.keep因为约定与 git 无关。

  • 可以说,约定的原因几乎明确是因为 git (20认同)
  • @JDPeckham Perforce 还需要存在文件来跟踪文件夹。 (2认同)

kri*_*yaa 5

文件.gitignore用于告诉 Git 应忽略哪些文件和文件夹。通常,这些文件是构建工件、临时文件或不属于存储库的其他类型的文件。Git 将忽略符合文件中模式的任何目录或文件.gitignore

例子:

# Ignore .DS_Store files
.DS_Store

# Ignore build artifacts
build/

# Ignore log files
*.log
Run Code Online (Sandbox Code Playgroud)

相反, .gitkeepGit 中使用文件来维护一个目录,否则该目录将为空。默认情况下,Git 不会跟踪空文件夹,因此.gitkeep如果您希望将文件保留在存储库中,则必须将文件添加到该目录。文件名比文件的实际内容更重要。

.gitkeep文件示例

# This file is used to keep the directory empty in Git
Run Code Online (Sandbox Code Playgroud)

总之。该.gitignore命令用于告诉 Git 要忽略哪些文件和文件夹。要维护一个否则为空的 Git 目录,请使用.gitkeep. 它们彼此不同并且具有不同的功能。