3

我实现了一个 git-hook 来通过 pyflakes 和 jshint 扫描我的提交,在阅读了 Yipit 关于为什么大多数预提交挂钩被破坏的评论之后,我选择了实现他的git stash建议git stash pop

不幸的是,git stash pop将文件标记为“已修改”,这会导致我的 IDE 在我返回该页面时警告我“已在磁盘上修改。从磁盘重新读取?” 然后它会询问“您确定要编辑此缓冲区吗?” 最后是“您确定要将此缓冲区保存在修改后的文件上吗?”

我很欣赏它试图为我做的一切,但它问我关于功能上不存在的“变化”。

除了玩奇怪的猜谜游戏之外,touch是否有某种方法可以防止git stash pop将它触及的所有文件标记为已更改?

4

2 回答 2

0

我不这么认为(例如,时间戳已更改,如“ GIT:将本地更改添加到非当前分支”中所述)。

最简单的方法是将您的 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

(注意你的钩子,它存在于你的第一个 repo 中,需要指定work-treegit-dir第二个 repo,才能正常工作)。
这是一个简化的提议,因为它没有考虑您正在处理的当前分支(它假设只有一个分支“主”)。
但是您可以检测到分支并从那里调整钩子(通过正确的结帐并切换到正确的分支)。

在其工作树的第二次 repo 更新后(通过第一个 repo 的 post-commit 挂钩),第二个 repo 已准备好用作原始工作树,您的 pre-commit hook(您的第一个和当前 repo)可以针对它安全运行。

于 2013-01-11T08:29:37.830 回答
0

您确定这些更改不存在吗?如果文件显示为已修改,则表明某些内容已更改,即使它是空格或文件的权限(可执行状态)。您可以使用git diff来查看更改。您还可以使用git commit -av命令查看更改(-v 标志将显示提交的差异)。

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

于 2013-01-11T08:52:16.003 回答