我对一个我不想提交到我的存储库的文件进行了本地更改.它是用于在服务器上构建应用程序的配置文件,但我想在本地使用不同的设置进行构建.当然,当我将'git status'作为要上演的东西时,该文件总是显示出来.我想隐藏这个特定的更改而不是提交它.我不会对文件进行任何其他更改.
经过一番挖掘后,我看到了两个选项:'假设未改变'和'跳过工作树'.这里的前一个问题谈到了它们,但并没有真正解释它们之间的区别.我的问题是:这两个命令有何不同?为什么有人会使用其中一个?
Bor*_*lid 588
你想要的skip-worktree.
assume-unchanged是为检查一组文件是否已被修改而昂贵的情况而设计的; 当您设置该位时,git(当然)假定在工作副本中尚未修改与该索引部分对应的文件.所以它避免了一堆乱七八糟的stat电话.只要索引中的文件条目发生更改(因此,当文件在上游更改时),此位就会丢失.
skip-worktree不止于此:即使git 知道文件已被修改(或需要由某个reset --hard等修改),它也会假装它没有使用索引中的版本.这将持续到索引被丢弃.
这里有一个很好的总结分歧和典型用例:http://fallengamer.livejournal.com/93321.html.
从那篇文章:
--assume-unchanged假设开发人员不应更改文件.此标志用于提高 SDK等不可更改文件夹的性能.--skip-worktree当你指示git不要触摸特定文件时,这很有用,因为开发人员应该更改它.例如,如果主存储库上游托管了一些生产就绪配置文件,并且您不希望意外地提交对这些文件的更改,那么--skip-worktree正是您想要的.Von*_*onC 95
注意:fallengamer在2011年进行了一些测试(因此它们可能已经过时),以下是他的发现:
操作
git pull:assume-unchanged标志的文件:Git不会覆盖本地文件.相反,它会输出冲突并建议如何解决它们skip-worktree标志的文件:Git不会覆盖本地文件.相反,它会输出冲突并建议如何解决它们.
git stashgit pullskip-worktreeassume-unchanged标志的文件:丢弃所有本地更改,而无法恢复它们.效果就像' git reset --hard'.' git pull'电话会成功skip-worktree标志的文件:Stash不适用于skip-worktree文件.' git pull'将失败并出现与上述相同的错误.开发人员被迫手动重置skip-worktree标志,以便能够存储并完成失败pull..
git pullassume-unchangedassume-unchanged标志的文件:内容更新,标志丢失.git ls-files -v'会显示该标志被修改为H(from h).skip-worktree标志的文件:内容已更新,标志已保留.git ls-files -v'会显示与S之前相同的旗帜pull..
git reset --hardskip-worktreeassume-unchangedassume-unchanged标志的文件:文件内容被还原.标志重置为H(从h).skip-worktree标志的文件:文件内容完好无损.国旗保持不变. 他补充以下分析:
看起来skip-worktree是很努力维护您的本地数据.但是,如果它是安全的,它不会阻止您获得上游更改.加上git不会重置标志pull.
但忽略这个reset --hard命令可能会成为开发人员的一个令人讨厌的惊喜.
Assume-unchangedflag可能会在pull操作中丢失,而且这些文件中的本地更改似乎对git不重要.
看到:
Junio(当前的git维护者)关于意图的评论assume-unchanged,
特别是,Junio指出assume-unchanged可能会意外地提交对文件的更改:"如果Git可以确定标记为assume-unchanged已更改的路径而不会产生额外的lstat(2)成本,则它保留报告路径
已被修改的权利(因此,git commit -a可以自由地做出改变)."
添加补丁后,在git邮件列表中讨论assume-unchanged和之间的区别skip-worktreeskip-worktree.
他的结论是:
实际上这两个标志都不够直观.
assume-unchanged假设开发人员不应更改文件.如果文件被更改 - 那个更改并不重要.此标志用于提高SDK等不可更改文件夹的性能.
但是如果承诺被破坏并且文件实际被更改,git会恢复标志以反映现实.可能在一般意思不是要更改的文件夹中有一些不一致的标志是可以的.
另一方面skip-worktree,当您指示git不要触摸特定文件时,这非常有用.这对已经跟踪的配置文件很有用.
上游主存储库托管一些生产就绪的配置,但您希望更改配置中的一些设置以便能够进行一些本地测试.并且您不希望意外检查此类文件中的更改以影响生产配置.在那种情况下,skip-worktree使完美的场景.
使用skip-worktree,如下所示:
\ngit update-index --skip-worktree changedfile.txt\nRun Code Online (Sandbox Code Playgroud)\n确认文件状态:
\n git ls-files -v\n S changedfile.txt\nRun Code Online (Sandbox Code Playgroud)\n第一个字母 S 表示该文件标有“skip-worktree”选项
\n原因:
\n\n\n“git-update-index --assume-unchanged 从来都不是要忽略对跟踪文件的更改(只是为了节省一些统计数据)。因此,不要建议将其作为实现这一目标的手段。”
\n
请参阅:https://github.com/git/git/commit/936d2c9301e41a84a374b98f92777e00d321a2ea
\n--skip-worktree 解释:
\n此选项会忽略对已跟踪文件的更改。无论对工作目录中的文件进行任何修改,git 始终使用索引中的文件内容和属性。\n这允许您对不希望推送到上游的文件进行更改。\n使用此命令选项如上所示。
\n要取消设置此选项,请使用--no-skip-worktree以下命令:
git update-index --no-skip-worktree changedfile.txt\nRun Code Online (Sandbox Code Playgroud)\n--假设不变解释:
\n此选项是专门针对需要占用大量资源来检查某些文件是否已修改的用例而设计的。为了优化慢速文件系统上的资源使用,git 不会检查文件以查看有问题的文件是否已更改,它假定工作目录中的文件没有被修改。\n每当文件的索引中的条目发生变化。例如,当上游修改文件时。
\n它的使用方法如下:
\ngit update-index --assume-unchanged changedfile.txt\nRun Code Online (Sandbox Code Playgroud)\n确认文件状态:
\ngit ls-files -v\nh changedfile.txt\nRun Code Online (Sandbox Code Playgroud)\n第一个字母 h 表示该文件标记有假定未更改的选项\n要取消设置此选项,请按\xe2\x80\x93no-assume-unchanged以下方式使用:
git update-index --no-assume-unchanged changedfile.txt\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
60295 次 |
| 最近记录: |