Py学习  »  Git

target/vs/target/in.gitignore

Code Complete • 5 年前 • 1592 次点击  

我正在使用Eclipse(这可能不相关),我想从commit中排除Maven目标文件夹。

lots 符号的

  1. /target/**
  2. */target/*
  3. /目标/**
  4. target/
  5. /target/

有什么区别?

它们的确切含义是什么?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/48341
 
1592 次点击  
文章 [ 1 ]  |  最新文章 5 年前
torek
Reply   •   1 楼
torek    6 年前

你可能想要 /target/ .

让我们从一个清晰的定义开始 工作树 (来自 the gitglossary ,拼写的位置 working tree ):

实际签出文件的树工作树通常包含 HEAD commit的树,加上您所做但尚未提交的任何本地更改。

我们需要记住,git存储的内容以及与其他git存储库的交换是 提交 是的。每次提交都会冻结一些文件集,以便将来随时可以告诉git 让我承诺 a123456... 把你提交的文件都拿回来 123456… 是的。(每个提交都有一个唯一的、大的、丑陋的hash id,如下所示 git log 输出和其他方面。)

提交与工作树

提交中的文件以一种特殊的、仅Git的、压缩的、重复数据消除的只读形式存储。我喜欢把这些文件 冻干 . 他们真的 不能 被改变。所以它们可以存档,但完全没用 工作 完成。因此,Git需要能够 提取 任何给定的提交,“再水化”冻干的文件,并把它们变成普通的日常文件,你可以看到,使用和使用。你放这些文件的地方是 工作树 工作树 是的。

当然,工作树有一个顶级目录(或者文件夹,如果您喜欢这个术语的话),您可以在其中存储各种文件,包括主目录 .gitignore 文件顶层目录可以有子目录(子文件夹),每个子文件夹可以有自己的子目录 .gitignore命令 文件也是。当你问起 /target target ,例如。

GitIgnore条目

中的条目 .gitignore命令 文件可以采用以下任何形式:

  • name (没有特殊字符,如 * )
  • name.* *.txt 甚至 name*txt
  • folder/
  • folder/*
  • folder/name
  • folder/name*txt 或是这些变体中的任何一个
  • folder/subfolder/
  • folder/subfolder/*
  • 上面的任何一个前缀是斜线,例如, /name /folder/ /folder/name
  • 以上任何一项,包括以斜线为前缀,然后以斜线为前缀 ! ,例如, !/folder/name

这不是故意的 详尽的 列出(您列出了其他几种形式),而不是说明一些基本原则:

  1. 一个简单的文件名意味着 具有此名称的任何文件或目录 是的。
  2. 名字 后缀 用斜线表示 具有此名称的任何目录(文件夹) 是的。作为文件的实体与此类条目不匹配。
  3. 条目可以有 嵌入的 斜线不在前面,也不在后面的斜线,例如 文件夹/名称 是的。
  4. 条目可以有 主要的 斜线,如 姓名 /文件夹/ ,或 二者都 前导斜线 嵌入斜线,例如 /文件夹/名称 是的。
  5. 条目可以有 地球仪 人物, * ** ,在不同的地方。
  6. 条目的前缀可以是 ! 是的。

gitignore条目的规则变得相当复杂,但一开始就足够简单了记住 .gitignore命令 可能在工作树的顶层文件夹中,或者在某个子文件夹中!

  • 一个没有嵌入斜杠或前导斜杠的普通名称与此文件夹或其任何子文件夹中的任何文件或文件夹匹配。
  • 斜线后缀的名称,没有嵌入斜线或前导斜线,与此文件夹或其任何子文件夹中的任何文件夹(但不是文件)匹配。
  • 如果条目有斜线前缀 一个 嵌入的 斜杠-一个就足够了-条目只匹配中的文件和/或文件夹 文件夹。因此 文件夹/名称 /文件夹/名称 意思是 同样的事情: 匹配名为 文件夹/名称 在里面 文件夹,即包含 .gitignore命令 文件与文件不匹配 sub/folder/name ,例如。
  • 如果一个条目以斜线结尾,则它只匹配文件夹(与其他内容无关)。

你说:

我想排除Maven目标文件夹

这需要回答一个子问题: 这个Maven目标文件夹在哪里?只有一个这样的文件夹吗,或者 target/ 子文件夹中的实体? (还有一个单独的问题,就是 .gitignore命令 指令并不完全代表人们认为它们的意思,你需要注意你的 指数 ,但我们将把它留给另一个部分。)

如果这意味着: 不包含任何内容 目标 在我的工作树的顶层,但是请继续并包括,例如,名为 sub/target/file 那么你应该使用:

/target/

作为 .gitignore命令 在你工作树的顶层有点多余,因为你已经知道了 /目标 一个文件夹,但它清楚地表示您希望忽略 文件夹 命名的 目标 在你工作树的顶层。

如果这意味着: 不包含任何内容 build-artifacts/target/ ,然后可以放置:

build-artifacts/target/

或:

/build-artifacts/target/

进入高层 .gitignore命令 ; 你可以放:

/目标/

进入之内 build-artifacts/.gitignore 是的。里面的那个 生成工件/.gitignore 需要一个前导斜杠,因为 /目标/ 没有 嵌入的 斜线,而最高层的那个 .gitignore命令 不需要前导斜杠,因为它有嵌入斜杠。

如果,在第三只手上(第一只脚?),要求是忽略 全部的 文件 任何 文件夹路径为的文件夹 包含 目标 组件,例如,您不仅要忽略 target/file 而且 sub/target/file2 sub/target/sub2/file3 –那么您应该使用:

target/

作为你的 .gitignore命令 可能在你工作树的顶层。

索引/暂存区域的角色

这个 .gitignore命令 文件是关于 工作树 ,但git不会生成新的提交 你的工作树相反,git从它调用的中间事物(不同地,git调用 指数 或者 中转区 . (这两个术语指同一实体。)

虽然索引有其他一些角色,但它的主要角色,特别是在这里,是它保存每个文件的副本 您提取的原始提交、更新的副本或全新的文件也就是说,如果你提取了 只是 两个文件 file1 folder/file2 ,您的索引现在将具有 文件1 文件夹/文件2 在里面。

索引中的副本与提交中的副本采用相同的冻干格式。不同的是你可以 代替 索引中的副本或添加到索引中,甚至减去索引中的副本。也就是说,你可以跑 git add file1 拿走 有用的 版本 文件1 在你的工作树上,把它冻干,然后把它塞进索引里你也可以这样做 文件夹/文件2 ,你可以把 新的 像这样的文件 folder2/file3 ./file4 我也是什么 git add 简言之,就是冻结文件的工作树版本并将其填充到索引中。

当你跑的时候 git commit ,git只需将索引中的所有内容打包 就在那时 从中做出新的承诺所以你必须 Git添加 所有文件:每次更改工作树副本时,都需要更新索引副本,否则git不会保存新版本:git只会再次保存旧版本。(为了节省空间,提交保存旧文件的相同版本 再利用 旧的冻干文件他们能做到的 因为 这些文件是只读的找到一个旧副本并重新使用它总是安全的,因为根据定义,git中的所有内容都会一直冻结。只能更改索引和工作树副本!)

换句话说,可以将索引看作 建议的下一次提交 . 将文件复制到其中以更新 建议的下一次提交 . 完全删除文件 建议的下一次提交,使用 git rm --cached git rm (没有 --cached ):git将从索引中删除该文件,也可能从工作树中删除,现在您提议的下一次提交根本没有该文件。

文件可以在索引/暂存区域中 在工作树上。这种事经常发生。这样的文件叫做 跟踪 是的。内容不必匹配:只是文件在索引中 马上 ,以及在工作树中,用于跟踪工作树文件。

如果文件被跟踪–如果它在索引中 马上 那你就不用 .gitignore命令 会影响它的。为了成功 已跟踪,必须将其从索引中移除。

如果从索引器中删除文件(如果它现在不在索引中,因为它不在您先前签出的提交中),则工作树副本是 未追踪 . 现在 这个 .gitignore命令 入境事宜这个 .gitignore命令 条目告诉Git:

  • 不要抱怨这个文件。 通常情况下, git status 会对你发牢骚,告诉你文件没有被追踪,天哪,天哪,你不应该 Git添加 是吗?这个 .gitignore命令 让Git对那个文件闭嘴。

  • 不要自动添加此文件。 如果你使用 git add . git add * 或者类似的事情,你告诉吉特: 添加所有内容。 这个 .gitignore命令 将其修改为: 添加所有内容 除了 这些未跟踪的文件也会被忽略,不要添加!

  • 它有第三个效果,就是给git许可 击球员 工作树文件在某些(罕见的)情况下,并改变 git clean 使用 -x -X 是的。

真的,不应该调用该文件 .gitignore命令 ,但更确切地说 .git-dont-whine-about-these-files-and-do-not-auto-add-them-either-and-maybe-occasionally-do-clobber-or-clean-them 是的。但谁想一直打这个?所以, .gitignore命令 是的。

结论

还有更多的事情要知道 .gitignore命令 但这已经够长了(可能太长了)摘要版本为:

  • .gitignore命令 只影响 未追踪 文件夹;
  • 主要是关上抱怨,避免自动添加;以及
  • 用斜杠表示 目录 / 文件夹 (不管你喜欢哪个词)和一个前导斜杠 发现于 目录 是的。当您有复杂的条目(带有嵌入斜杠)时,前导斜杠是多余的,但会传达您的意图。

如果你 不要 想要前导斜线效果,但是 如果需要嵌入斜杠,则必须将忽略条目分发到子目录/子文件夹,或者使用 ** 与任意数量的路径组件匹配的符号(作为前导组件)。否则很少需要 ** 完全。

这里不包括:一旦Git意识到它不必 阅读 一个工作树目录,它不需要读它因此,忽略子目录通常会导致无法取消忽略(使用 ! 规则)任何东西 在内部 子目录。