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

时间:2016-03-07 06:38:20

标签: git

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

我所知道的两个选项是:

  1. 从存储库中删除它们: 1
    一个。更新.gitignore
    git rm --cached <file>或......

  2. git update-index --assume-unchanged <file> 2

  3. 这两个问题都可以在这个问题中看到:Ignore files that have already been committed to a Git repository

    在这里:

    Git: ignore specific file(s) both on Commit and Pull

    1 ...但是,我希望他们留在存储库中,并在下次提交完成后将其删除。

    2 ...此选项,根据this answer from this question说明:

      

    假设 - 忽略机制不应滥用。它是&#34;我知道我的文件系统操作很慢......特别是,Git并不承诺Git总是认为这些路径是未经修改的...它保留报告路径已被修改的权利(因此,&#34; git commit -a&#34;可以自由提交更改)。

    那么有没有一种正确的方法来提交这些文件,将它们保存在存储库中的状态,然后忽略对它们的任何进一步更改?

    我确实在这里找到了一些信息:https://gist.github.com/canton7/1423106

    但似乎......涉及到了。是不是没有git包含的实际选项 - 就像--assume-unchanged那样,但没有对git说谎?

2 个答案:

答案 0 :(得分:2)

Git 1.7.0开始,您有第三个选项:sparse checkout

使用稀疏结帐时,您基本上会告诉Git 从工作树中排除一组文件。这些文件仍然是存储库的一部分,但它们不会显示在您的工作目录中。

在内部,稀疏结帐使用skip-worktree标志将所有排除的文件标记为始终更新。来自documentation

  

在阅读条目时,如果它被标记为skip-worktree,那么Git   假装其工作目录版本是最新的并阅读   索引版本。

以下是您在existing repository中启用稀疏结帐的方式:

  1. 使用git config core.sparseCheckout true
  2. 在您的存储库中启用稀疏结帐
  3. 创建一个.git/info/sparse-checkout文件,其中包含工作目录中 include 的路径。在您的情况下,您必须包含所有内容,然后通过在其路径前添加!排除特定文件:

    /* !path-to-the-file-to-exclude

  4. 使用git read-tree -mu HEAD

  5. 更新您的工作目录

    请注意,如果您想要取回已排除的文件,仅使用git config core.sparseCheckout false禁用稀疏结帐是不够的。您首先必须修改.git/info/sparse-checkout文件以包含所有内容,只需指定/*,然后使用git read-tree -mu HEAD更新您的工作树在配置文件中禁用稀疏检出。

答案 1 :(得分:1)

有几个选项:

--assume-unchanged

由于git跟踪内容,一旦你将内容添加到git,它就会被跟踪。 turn-off 的一种方法跟踪是在所需的 --assume-unchanged 上设置资源。

  

<强> 提示:

      
#
# list assumed unchanged files
#
git ls-files -v | grep ^h

.gitignore & git rm --cached

另一种方法是删除并提交已删除的文件,以便git也会停止跟踪它。

 
# Delete desired content to untrack
git rm --cached <path>

# commit the deleted content
git commit -m "Deleted ..."

--skip-worktree

git update-index --skip-worktree <path>
  

<强> --[no-]skip-worktree
  指定其中一个标志时,不会更新为路径记录的对象名称。

     

相反,这些选项设置和取消设置路径的“skip-worktree”位。有关详细信息,请参阅下面的“跳过工作树位”部分。

           

Skip-worktree bit

     

Skip-worktree位可以在一个(长)句子中定义:当读取条目时,如果它被标记为skip-worktree,那么Git假装其工作目录版本是最新的并且读取索引版本代替

     

详细说明,reading表示检查文件是否存在,读取文件属性或文件内容。工作目录版本可能存在或不存在。

     

如果存在,其内容可能与索引版本匹配。写入不受此位影响,内容安全仍然是第一优先。

     

请注意,Git可以更新工作目录文件,标记为skip-worktree,如果安全的话(即工作目录版本与索引版本匹配)

     

虽然这个位看起来类似于假设未改变的位,但它的目标与假设未改变的位不同。当设置

时,Skip-worktree也优先于假定未更改的位