【问题标题】:.gitignore ignore all files then recursively allow *.foo.gitignore 忽略所有文件,然后递归允许 *.foo
【发布时间】:2011-12-22 22:05:20
【问题描述】:

已经有几个类似的问题,但没有一个答案对我有用。

我想忽略存储库下方文件夹中的所有内容,但带有 *.foo 的文件除外

(如果有人想知道如何证明这是合理的——我实际上正在为我所有的“逻辑”项目——mac 上的音乐软件——创建一个 git 存储库——但我只想存储实际的项目文件 *.logic)

我要把它拼出来,所以我们都在同一个盘子上。 这是我所做的,从头开始:

设置:

mkdir temp
cd temp
mkdir testdir
cd testdir
touch include.foo
touch dontinclude.bad
cd..
git init
touch .gitignore

将其粘贴到 .gitignore

# Ignore all
/*

# But not these files...
!.gitignore
!*.foo

混帐状态

唯一未跟踪的文件是 .gitignore

如果我输入 'git add .' - 没有变化,只看到 .gitignore 并且我的 2 个文件被忽略了。

为什么这不起作用?如何更改上述程序以使其起作用?

这是我从中获得 .gitignore 文件的极其相似的问题。 我正在使用 git --version 1.7.7(也尝试过 1.7.3)-.gitignore to ignore all files, then recursively allows files of a certain type

【问题讨论】:

  • 等等,你git add .gitignoregit commit -m "added gitignore"了吗?
  • fwiw,关于这个主题的重复答案的祖父 - 你应该仔细查看 - 可能是Make .gitignore ignore everything except a few files - 非常有规律的活动和几个很好的答案。我是this answer 的特别粉丝,它看起来清晰透彻。

标签: git


【解决方案1】:

您的问题是开头的 /* 模式匹配顶层的所有文件和目录 - 包括 testdir,因此 testdir 内的所有内容都被忽略。

这就是你想要的:

# Ignore everything
*
# Don't ignore directories, so we can recurse into them
!*/
# Don't ignore .gitignore and *.foo files
!.gitignore
!*.foo

当您使用此配置执行 git add . 时,您会发现只有 .gitignore*.foo 文件被列为要提交的更改。

【讨论】:

  • 不过,顺便说一句,在我的带有 .logic 文件的现实世界版本中,它神秘地不起作用。我重新创建了 git repo,检查了一百万次,准确地复制了 .gitignore,更改为 .logic,find 。 -name "*.logic" 返回大量文件,但是这个 .gitignore 忽略了所有 *.logic 文件......肯定会发生一些愚蠢的事情......当我最终破解它时可能值得跟进评论
  • @PandaWood:确保您没有在~/.gitconfig 中设置core.excludesfile 指向的文件具有排除您的*.logic 文件的模式。
  • 我发现“不要忽略子目录”行使排除在 .gitignore 中递归工作。例如,我不想忽略目录 bar/。为此,在此答案中显示的行之后,我只是添加了 !bar/*!bar/**/* 并且 bar/ 及其子目录中的所有文件递归都没有被忽略。
  • 我在 Stackoverflow 上找到的最佳 gitignore 答案,由于 'unignore .gitignore' 部分
  • 这个解决方案。具体来说,防止目录被忽略的命令 (!*/) 似乎只有在将其应用于根目录时才有效。因此,如果要将其应用于子目录,则必须在子目录中创建一个新的 .gitignore 文件。
猜你喜欢
  • 2011-08-18
  • 1970-01-01
  • 2014-07-06
  • 1970-01-01
  • 2022-11-16
  • 1970-01-01
  • 2016-05-08
  • 1970-01-01
  • 2018-10-01
相关资源
最近更新 更多