Git结帐文件来自分支而不跟踪它们

时间:2017-06-10 22:19:07

标签: git branch gitignore

我的问题是:我有一个git repo,其中包含.gitignore文件中的目录。通常这可以工作,并且忽略目录中更改的所有文件。但是,如果我将文件签出到忽略那些文件的分支的忽略目录中,例如:

git checkout a_branch /c/IgnoredDirectory 

我发现当我执行

时,现在会跟踪应该忽略的目录和文件
git status

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

代码:

我的.gitignore文件

RecordDataBases/

当我从单独的分支机构签出文件并运行git状态时,我得到:

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

由于

1 个答案:

答案 0 :(得分:1)

这是正确的:git checkout commit-specifier -- paths将指定路径中的指定路径复制到索引(也称为暂存区)。一旦他们进入索引,就会跟踪。然后,它使用相同的完整路径将文件从索引复制到工作树。

由于索引 的任何文件都按照定义进行跟踪,因此您的任务要么是为了避免首先将它们放入索引中,要么删除它们之后又来了。后者更容易:

git rm -r --cached RecordDataBases/
例如

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

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

  • 这需要一次执行一个文件(没有简单的方法来获取包含子树的整个目录树);和
  • 默认情况下,省略任何行尾,标识或涂抹过滤器操作。

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