如何避免"git stash pop"将文件标记为已修改?

3
我实现了一个git-hook,通过pyflakes和jshint扫描我的提交。在阅读了Yipit对大多数pre-commit hooks为什么失效的评论why most pre-commit hooks are broken之后,我选择实现他的git stash和git stash pop建议。
不幸的是,git stash pop会将文件标记为“已修改”,这会导致我的IDE在返回该页面时警告我“磁盘上已修改,请重新从磁盘读取?”然后它会问“您确定要编辑此缓冲区吗?”最后问“您确定要将此缓冲区保存到已修改的文件中吗?”
我很感激它为我所做的一切,但它正在询问关于不存在的“更改”。
除了使用touch进行奇怪的猜测游戏外,有没有办法防止git stash pop将其触及的所有文件都标记为已更改?
2个回答

0

我认为不是这样的(例如在 "GIT: Adding Local Changes to Non-Current Branch" 中提到,时间戳被更改了)。

最简单的方法是配置你的 IDE 自动刷新。

例如对于 Eclipse,这将是 "Refresh on Access" 设置。


另一种方法是保留另一个本地仓库(其中从未进行本地修改,因此无需存储)。您的预提交挂钩仍然在当前仓库中。
您的挂钩将使用当前索引(您已添加的内容),但使用另一个工作树仓库。为此,您需要使用以下命令进行提交:
git commit --work-tree=/path/to/other/local/repo -m "my commit message"

如果钩子没有失败,您可以在当前存储库中使用提交后钩子前往其他存储库,并拉取当前分支,更新其(原始的)工作树。
cd /path/to/other/local/repo 
git --work-tree=/path/to/other/local/repo --git-dir=/path/to/other/local/repo/.git pull

(请注意,您的钩子位于第一个存储库中,需要指定第二个存储库的工作树git-dir才能正常工作)。
这是一个简化的建议,它没有考虑您正在使用的当前分支(它假设只有一个分支'master')。
但是您可以检测分支并从那里适应钩子(使用正确的检出和切换到正确的分支)。

在第二个存储库更新其工作树后(通过第一个存储库的提交后钩子),该第二个存储库已准备好作为原始工作树,针对其您的第一个和当前存储库的预提交钩子可以安全地操作。


备忘录:这是我在Stack Overflow上的第7000个答案(52个月内),在6000个答案之后6个月。在此之前,还有5000个答案4000个答案3000个答案2000个答案1000个答案 - VonC

0

你确定更改是不存在的吗?如果文件显示为已修改,则表示有些内容已经发生了变化,即使只是空格或是文件权限(可执行状态)也会导致这种情况。

你可以使用 git diff 命令查看更改。你还可以通过使用 git commit -av 命令来审查更改(-v 标志将显示提交的差异)。

你的 IDE 会保留文件当前的“缓冲”状态。如果该文件在磁盘上发生了更改(例如使用 git stash pop|apply),IDE 将识别到这一点,并且除非你已经设置它自动刷新文件(通常在 IDE 设置/首选项中),否则它可能会提示你是否要将当前缓冲保存为一个新文件-- 这通常不是使用 git 时必需的 -- 或者重新加载具有文件更改状态的缓冲区。


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