我有一些我为第一个版本提交的目标文件和程序集文件。当我更改项目并更新其他源文件时,我不想提交对这些文件的更改。但是,我做希望在第一次提交时将它们保存在我的存储库中。
我所知道的两个选项是:
从存储库中删除它们: 1
一个。更新.gitignore
湾git rm --cached <file>
或......
git update-index --assume-unchanged <file>
2
这两个问题都可以在这个问题中看到: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说谎?
答案 0 :(得分:2)
从Git 1.7.0开始,您有第三个选项:sparse checkout。
使用稀疏结帐时,您基本上会告诉Git 从工作树中排除一组文件。这些文件仍然是存储库的一部分,但它们不会显示在您的工作目录中。
在内部,稀疏结帐使用skip-worktree
标志将所有排除的文件标记为始终更新。来自documentation:
在阅读条目时,如果它被标记为skip-worktree,那么Git 假装其工作目录版本是最新的并阅读 索引版本。
以下是您在existing repository中启用稀疏结帐的方式:
git config core.sparseCheckout true
创建一个.git/info/sparse-checkout
文件,其中包含工作目录中 include 的路径。在您的情况下,您必须包含所有内容,然后通过在其路径前添加!
来排除特定文件:
/*
!path-to-the-file-to-exclude
使用git read-tree -mu HEAD
请注意,如果您想要取回已排除的文件,仅使用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也优先于假定未更改的位