Git 将文件一次包含到存储库中,然后忽略后续更改的正确方法是什么?

Git 将文件一次包含到存储库中,然后忽略后续更改的正确方法是什么?,git,Git,我有一些对象文件和程序集文件,我已经提交了第一个版本。在对项目进行更改并更新其他源文件时,我不想提交对这些文件的更改。但是,我确实希望在第一次提交时将它们保存在我的存储库中 我知道的两个选择是: 从存储库中删除它们:1 A.Update.gitignore bgit rm--缓存的或 git更新索引--假定未更改2 在这个问题中可以看到这两个方面: 在这里: 1…但是,我希望它们留在存储库中,并在下一次提交完成时将其删除 2…此选项,如注释所示: 假设unchanged不应被滥用为忽略机制。

我有一些对象文件和程序集文件,我已经提交了第一个版本。在对项目进行更改并更新其他源文件时,我不想提交对这些文件的更改。但是,我确实希望在第一次提交时将它们保存在我的存储库中

我知道的两个选择是:

  • 从存储库中删除它们:1
    A.Update.gitignore
    b<代码>git rm--缓存的或

  • git更新索引--假定未更改
    2

  • 在这个问题中可以看到这两个方面:

    在这里:


    1…但是,我希望它们留在存储库中,并在下一次提交完成时将其删除

    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>