Git 从分支签出文件而不跟踪它们

Git checkout files from a branch without tracking them

我的问题是:我有一个 git 存储库,在 .gitignore 文件中有一个目录。通常这是可行的,目录中更改的任何文件都将被忽略。但是,如果我从 的分支将文件检出到忽略的目录中,则忽略这些文件,即:

git checkout a_branch /c/IgnoredDirectory 

我发现当我这样做时应该忽略的目录和文件现在被跟踪

git status

那么如何从单独的分支添加文件而不让它们被 git 跟踪?我的想法是 git 应该忽略我添加的文件,因为它们位于 .gitignore 文件的忽略目录中。我哪里看错了?

代码:

我的.git忽略文件

RecordDataBases/

当我从一个单独的分支检出文件和 运行 git 状态时,我得到:

    new file:   RecordDataBases/AstroFiles
    new file:   RecordDataBases/AstroFiles_goodversion
    new file:   RecordDataBases/AstroFiles_old_file
    new file:   RecordDataBases/README.rtf

谢谢

正确:git checkout <em>commit-specifier</em> -- <em>paths</em>将指定提交中的指定路径复制到 index(也称为 暂存区)。一旦它们进入索引,它们就会被 跟踪 。然后它使用从任何目录或 glob 扩展产生的相同完整路径将文件从索引复制到工作树。

因为索引 的任何文件都是按定义跟踪的 ,您的任务是避免将它们放入索引中首先,或者之后再次删除它们。后者更简单:

git rm -r --cached RecordDataBases/
例如

(但请注意,它将删除此类文件的 所有 索引条目,而不仅仅是 git checkout 步骤创建的索引条目)。 --cached 选项告诉 git rm 仅从索引中删除文件 ,而不是从工作树中删除文件。

您可以不执行上述操作,而是从指定的提交中提取文件,而无需先将它们复制到索引中。最简单的方法是使用 git show,语法为 git show <em>commit-specifier</em>:<em>path</em> > <em>路径</em>,例如git show a_branch:RecordDataBases/AstroFiles > RecordDataBases/AstroFiles。除了需要重复每个路径名之外,这里还有一些注意事项:

  • 这需要一次处理一个文件(没有简单的方法来获取包括子树在内的整个目录树);和
  • 默认情况下,任何行尾、识别或污迹过滤器操作都会被忽略。

但是因为这不会先将扩展路径复制到索引中,所以之后不需要将它们从索引中删除。