gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 14:17:14 25 4
gpt4 key购买 nike

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

git checkout a_branch /c/IgnoredDirectory 

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

git status

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

代码:

我的.gitignore 文件

RecordDataBases/

当我从单独的分支 checkout 文件并运行 git status 时,我得到:

    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>将指定提交中的指定路径复制到索引(也称为暂存区)。一旦它们进入索引,它们就会被跟踪。然后它将文件从索引复制到工作树,使用从任何目录或 glob 扩展产生的相同完整路径。

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

git rm -r --cached RecordDataBases/

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

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

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

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

编辑: Git-2.23 中的新功能 git restore可以从提交中提取文件而不将其写入索引。 (此选项在最初提出问题时不可用。)这比事后修复更容易,但对于许多文件来说仍然有点尴尬。

要在不干扰任何其他内容的情况下提取特定提交(全部),请考虑使用 git worktree add--detach创建指定提交的分离头提取。额外的工作树可用于获取所有文件。或者,考虑使用 git archive (参见 its documentation )为特定提交或其某些子集制作 tar 或 zip 文件。注意 git archive可能与 checkout 略有不同(它可能会按照指示进行存档替换;再次,请参阅文档)。

关于Git 从分支 checkout 文件而不跟踪它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44478600/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com