如何防止git stash丢失带有“假定未更改”位的文件更改?

29

我曾经在一些文件上使用 git update-index --assume-unchanged 命令,以防止它们的更改被提交。

在存储库中使用 git stash 时,这些更改会与其他未完成的更改一起被暂存。这是预期的行为,但是 git stash pop 不会将它们带回来,因此更改就会丢失。

有谁知道如何防止带有 assume unchanged 标记的文件出现在暂存区?另外,也许您知道如何确保针对这些文件进行的任何更改至少被带回来?


Git stash在1.7.2版本中无法隐藏更改。您使用的是哪个版本的Git? - William Pursell
我的 Git 版本是 1.7.1。我会尝试升级到 1.7.2,看看是否能解决问题。 - Stephen Emslie
不幸的是,在Ubuntu上的git版本1.7.5.1中,我仍然看到这种行为。 - Stephen Emslie
这个问题类似于https://dev59.com/2Gkw5IYBdhLWcg3wi7Jz#14777785。 - Eric Woodruff
2个回答

8

assume-unchanged是一种性能优化,代表你承诺该文件未发生更改。如果你实际上更改了文件,则不能保证其正确性。你应该重新设计您的仓库,不要提交这些文件(可以提交filename.sample和.gitignore filename),或通过分支操作使你不想与世界分享的文件处于另一个分支或其他隐藏状态。

关于如何隐藏这些更改,我见过/想到了四个建议:

1:使用smudge/clean过滤器在检出时将文件更改为所需的内容,并在签入时清除(比较丑陋)。

2:根据http://thomasrast.ch/git/local-config.html中的描述创建本地配置分支。关键是要记住,你需要在主分支上进行开发,并在配置分支上进行合并以进行测试。然后返回主分支以进行更改、推送等操作。

3:创建私有开发分支,进行永远不希望分享的更改,然后进行虚假合并(git merge -s ours privatebranch)。然后你可以在私有分支上开发和测试,并且你不想分享的更改不会在合并回来时出现,只要该更改与你的正常工作相隔甚远。但是,当你从上游获取新的更改时,你需要将它们直接从上游拉到私有分支。然后你需要将私有分支合并回主分支,并从主分支推送到上游。你绝不能将主分支合并回私有分支。同样,你也不能进行变基(可能rebase -p能够成功,但不保证)。这些合并/变基以及必须出现在哪里使得这种方法不太吸引人。

4:创建私有开发分支,进行永远不希望分享的更改,然后创建合并驱动程序(参见man gitattributes),该驱动程序将拒绝将文件从主分支合并到私有分支或从私有分支合并到主分支(可能通过比较私有分支上文件的SHA值和其他分支上文件的SHA值并复制之前的值,如果匹配则拒绝合并)。


我尝试了私有开发分支。我创建了一个私有分支,进行了一次提交以保存我的更改,然后切换回主分支并执行了合并-s ours。但是当我将主分支合并到私有分支时,它覆盖了我的更改。 - Casebash
@Casebash: 你没有完全描述发生了什么,但我猜测是主分支改变了你改变的文件。这确实会导致这些更改在将主分支合并到私有分支时传播到私有分支中。如果你也从私有分支完全合并到主分支,你可以使用 git checkout HEAD^ -- myfile 获取旧版本并再次使用 merge -s ours。-s ours的目的是防止来自private的更改进入main。除非该文件在单个提交中被更改,否则无法阻止来自main的新更改进入private。 - Seth Robertson
@Casebash:嗯,我什么也没说,但我刚想起了git的一个很棒的功能。你可以定义一个自定义合并驱动程序,在合并期间拒绝进行任何更改。但是,合并驱动程序必须具有分支感知能力。您不希望更改进入或离开私有分支,但您确实希望它们从origin/main进入main。 - Seth Robertson
我已经完全描述了它 - 我没有做任何其他更改。合并的目的是使分支相同 - 这就是为什么将其拉回私有部分会破坏私有更改的原因。 - Casebash
@Casebash:嗯,我明白你的意思了。我没有考虑“our”合并作为一种变更,但很明显Git是这样认为的。我想那里唯一的选择就是从上游/主分支中拉取private分支而不是本地主分支,然后在从private合并后从主分支推送回上游/主分支。只要你永远不使用--rebase(异端邪说!),一切都会正常工作。这次测试过了。尽管如此,仍然相当烦人。 - Seth Robertson
4
所以,你的意思是“假设未更改”并不适用于任何人实际使用它的唯一事情吗? - BlueRaja - Danny Pflughoeft

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接