Git 将文件一次包含到存储库中,然后忽略后续更改的正确方法是什么?
我有一些对象文件和程序集文件,我已经提交了第一个版本。在对项目进行更改并更新其他源文件时,我不想提交对这些文件的更改。但是,我确实希望在第一次提交时将它们保存在我的存储库中 我知道的两个选择是:Git 将文件一次包含到存储库中,然后忽略后续更改的正确方法是什么?,git,Git,我有一些对象文件和程序集文件,我已经提交了第一个版本。在对项目进行更改并更新其他源文件时,我不想提交对这些文件的更改。但是,我确实希望在第一次提交时将它们保存在我的存储库中 我知道的两个选择是: 从存储库中删除它们:1 A.Update.gitignore bgit rm--缓存的或 git更新索引--假定未更改2 在这个问题中可以看到这两个方面: 在这里: 1…但是,我希望它们留在存储库中,并在下一次提交完成时将其删除 2…此选项,如注释所示: 假设unchanged不应被滥用为忽略机制。
A.Update.gitignore
b<代码>git rm--缓存的或
git更新索引--假定未更改
21…但是,我希望它们留在存储库中,并在下一次提交完成时将其删除 2…此选项,如注释所示: 假设unchanged不应被滥用为忽略机制。它是“我知道我的文件系统操作是缓慢的……尤其是,GIT不是一个承诺,Git总是认为这些路径是未修改的……它保留了报告路径被修改的权利(因此,“Git提交-A”可以自由提交更改)。 那么,是否有一种适当的方法可以提交这些文件一次,将它们保持在存储库中的该状态,然后忽略对它们的任何进一步更改 我确实在这里找到了一些信息:
但它似乎……涉及到了。git中是否没有实际的选项可以像这样工作——假设unchanged可以,但不会欺骗git?有几个选项:
--假定未更改
由于git跟踪内容,一旦您将内容添加到git,它将被声明为被跟踪。关闭跟踪的一种方法是设置所需资源的——假定未更改
提示:
.gitignore&git rm--缓存
另一种方法是删除并提交已删除的文件,这样git也将停止跟踪它
-[no-]跳过工作树
指定其中一个标志时,不会更新为路径记录的对象名称
相反,这些选项设置和取消设置路径的“跳过工作树”位。有关详细信息,请参阅下面的“跳过工作树位”
跳过工作树位
跳过工作树位可以用一个(长)句子定义:当读取条目时,如果它被标记为跳过工作树,那么Git会假装它的工作目录版本是最新的,读取索引版本
更详细地说,读取
意味着检查文件是否存在,读取文件属性或文件内容。工作目录版本可能存在或不存在
如果存在,其内容可能与索引版本匹配或不匹配。写入不受此位的影响,内容安全仍然是首要任务
请注意,如果安全的话,Git可以更新工作目录文件,即标记为skip worktree的文件(即工作目录版本与索引版本匹配)
尽管此位看起来类似于“假定未更改位”,但其目标与“假定未更改位”不同。当两者都设置时,“跳过工作树”也优先于“假定未更改位”
截至目前,您还有第三个选项:
使用稀疏签出,您基本上会告诉Git从工作树中排除一组特定的文件。这些文件仍然是存储库的一部分,但不会显示在您的工作目录中
在内部,稀疏签出使用跳过工作树
标志将所有排除的文件标记为始终更新。从:
读取条目时,如果它被标记为skip worktree,则为Git
假装其工作目录版本是最新的,并读取
改为索引版本
以下是如何在中启用稀疏签出:
使用git config core.sparseCheckout true在存储库中启用稀疏签出
创建一个.git/info/sparse checkout
文件,其中包含要包含在工作目录中的路径。在您的情况下,您必须包含所有内容,然后通过在其路径前面添加一个!
来排除特定文件:
/*
!要排除的文件的路径
使用git read tree-mu HEAD更新您的工作目录
请注意,如果要返回排除的文件,仅使用git config core.sparseCheckout false禁用稀疏签出是不够的。首先必须修改.git/info/sparse checkout
文件,只需指定/*
,即可包含所有内容,并使用git read tree-mu更新工作树头部
,然后在配置文件中禁用稀疏签出。从什么时候开始可以将其他人的答案复制到您自己的答案中?请删除复制的部分,或者直接链接到相关答案,或者不要麻烦。Np,我在您的答案中添加了一条消息,并为您提供了完整的积分。我将删除它。
#
# list assumed unchanged files
#
git ls-files -v | grep ^h
# Delete desired content to untrack
git rm --cached <path>
# commit the deleted content
git commit -m "Deleted ..."
git update-index --skip-worktree <path>