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
。除了需要重复每个路径名之外,这里还有一些注意事项:
- 这需要一次处理一个文件(没有简单的方法来获取包括子树在内的整个目录树);和
- 默认情况下,任何行尾、识别或污迹过滤器操作都会被忽略。
但是因为这不会先将扩展路径复制到索引中,所以之后不需要将它们从索引中删除。
我的问题是:我有一个 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
。除了需要重复每个路径名之外,这里还有一些注意事项:
- 这需要一次处理一个文件(没有简单的方法来获取包括子树在内的整个目录树);和
- 默认情况下,任何行尾、识别或污迹过滤器操作都会被忽略。
但是因为这不会先将扩展路径复制到索引中,所以之后不需要将它们从索引中删除。