尽管 .gitignore 文件强制添加

Posted

技术标签:

【中文标题】尽管 .gitignore 文件强制添加【英文标题】:Force add despite the .gitignore file 【发布时间】:2011-12-21 19:50:12 【问题描述】:

尽管有.gitignore 文件,有没有办法强制git 添加文件?

【问题讨论】:

一个更好的问题可能是 - 你为什么要这样做?如果要跟踪文件,请取消忽略它(在 .gitignore 文件中使用 ! 为其模式添加前缀,例如 !dont/ignore/this/file)。 @OhadSchneider 如果您强制将构建文件提交到另一个分支,这很有用。一些项目这样做,例如用于安全部署的 StrongLoop @OhadSchneider 对我们来说,更多的是因为大多数开发人员使用 Visual Studio 2015 安装 git,它在用户文件夹中添加了一个全局 gitignore。这不包括 *.dll 和 *.exe 等文件。这对于我们只使用在构建期间检索到的 nuget 包的新项目来说非常有用,但对于少数旧项目,我们仍然使用在解决方案中手动引用的 dll。对于这些项目,我们希望手动包含它们,而不是告诉每个开发人员在全局 gitignore 中注释 *.dll 和 *.exe 文件。 @Nullius 你不能在更高级别的.gitignore 中取消忽略它们(例如,在与dll 相同的文件夹中添加.gitignore,或者在上面的文件夹中,或其他什么)?跨度> 【参考方案1】:

如何取消忽略已忽略文件夹中的某些选定内容(文件或文件夹)

如果您忽略了 目录的内容,如下所示:

/ignored_dir/*    # ignore the **contents of** this dir!

然后你可以像这样 UNignore 里面的文件或目录:

!/ignored_dir/special_file_to_include   # Do NOT ignore this file--DO include it!
!/ignored_dir/special_dir_to_include/   # And do NOT ignore this dir--DO include it!

但是,如果您像这样直接忽略了“ignored_dir”:

/ignored_dir/     # ignore this directory **directly**

那么上述! 试图取消忽略某些文件或文件夹的规则将不起作用!因此,在这种情况下,从使用这种风格:/ignored_dir/ 切换到这种风格:/ignored_dir/*,然后将您的 ! 规则如上所示添加到 UNignore 该目录中的某些内容!

参考资料:

    Unignore subdirectories of ignored directories in Git [我的eRCaGuy_dotfiles repo 带有包含这些注释和演示的示例 .gitignore 文件]:eRCaGuy_dotfiles/.gitignore

【讨论】:

作为对上述 A-S 答案的编辑(尽管相当广泛),这可能会更好,因为它是相同的答案并且一个有 24 票所以总是会显得更高。 (不过你的版本更有帮助。) @DarrenCook,我不想对别人的答案进行广泛的编辑。 Stack Overflow 的主要吸引力之一是答案和内容的个人所有权,而大型编辑会扰乱这一点。我认为我的回答也更有帮助,我希望自己保持对它的所有权,以使其成为我喜欢的方式,并在此过程中获得一些荣誉。最终,如果像你这样的人支持它,它就会浮到顶部。我已经看过几十次了。我添加它是因为它提供了新的、缺乏的内容和洞察力,而这些内容和见解尚未出现在此页面上。【参考方案2】:

尽管 Daniel Böhmer 提供了可行的解决方案,Ohad Schneider 在评论中提供了更好的解决方案:

如果该文件通常被忽略,而您强制添加它 - 将来可能会再次被意外忽略(例如当文件被删除时,然后提交并重新创建文件。

您应该在 .gitignore 文件中取消忽略它,如下所示: Unignore subdirectories of ignored directories in Git

【讨论】:

这是正确的。我对小数据文件使用了 --force 选项,然后重新排列了一些文件夹结构并破坏了所有强制跟踪的文件。但是:在 .gitignore 中使用 !specific-file-name.txt 而不使用文件夹层次结构,这样跟踪将跟随 repo 周围的文件。 视情况而定,例如有时您想在所有文件夹中排除“1.txt”,有时要排除“folder1/*.txt” 这不是一个“更好”的解决方案。这是解决不同问题的方法。 @aij - 我不同意,我的回答提供了另一种“尽管 .gitignore 文件的(当前状态)强制 git 添加文件的方法”。尽管括号中的额外文字是我添加的-我认为问题的文字也暗示了这一点。无论如何,我认为这对于考虑使用“--force”选项的人来说也是重要的信息【参考方案3】:

实现它的另一种方法是临时编辑 gitignore 文件,添加文件,然后恢复 gitignore。我觉得有点hacky

【讨论】:

我同意,这不是你想做的。【参考方案4】:

man git-add:

   -f, --force
       Allow adding otherwise ignored files.

所以运行这个

git add --force my/ignore/file.foo

【讨论】:

嗯,这不起作用,在 git status 上文件仍然没有显示 好吧,我对其进行了测试以确保它确实有效并且确实有效。你能描述你的环境(操作系统,git版本......)吗?这就是我基本上所做的:echo "/foo" >> .gitignore; echo "bar" > foo; git add foo # should throw an error; git add -p foo # works(不能在评论中粘贴换行符,执行命令 1 by 1 同样的事情发生在我身上,我之前在我的文件上运行过 git update-index --asume-unchanged 。我不得不用 --no-assume-unchanged 撤消它并且它起作用了 这仅适用于我使用通配符,在 Windows 上使用 git 1.9.5,即使在尝试 --no--assume-unchanged 之后也是如此。 “git add -f ”什么都不做,但“git add -f *”有效。使用 TortoiseGit 也可以。 @mhenry1384 通配符仅在 Windows 中有效的原因可能是路径分隔符的使用方式。对我来说,斜杠“/”有效,但反斜杠“\”无效。 cmd/PowerShell 为我们将“/”转换为“\”这一事实让我们很容易遇到这种情况。

以上是关于尽管 .gitignore 文件强制添加的主要内容,如果未能解决你的问题,请参考以下文章

在已跟踪大量文件的现有存储库上应用gitignore

如何创建.gitignore文件,忽略不必要提交的文件

解释哪个 gitignore 规则忽略了我的文件

gitignore忽略处理

忽略特殊文件

忽略特殊文件