有没有办法防止" git stash pop"从标记文件修改?

时间:2013-01-10 21:46:23

标签: git git-stash

我实现了一个git-hook来通过pyflakes和jshint扫描我的提交,在阅读Yipit对why most pre-commit hooks are broken的评论后,我选择实现他的git stashgit stash pop建议。

不幸的是,git stash pop将文件标记为“已修改”,然后每当我返回“在磁盘上修改过的页面时,我的IDE就会发出警告。重新读取磁盘?”然后询问“你确定要编辑这个缓冲区吗?”最后“你确定要将这个缓冲区保存在修改过的文件上吗?”

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

如果没有使用touch玩奇怪的猜谜游戏,是否有某种方法可以阻止git stash pop将所触及的所有文件标记为已更改?

2 个答案:

答案 0 :(得分: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"

如果挂钩没有失败,你可以使用一个post-commit挂钩(仍然在你当前的仓库中)转到另一个仓库,并拉出当前分支,更新其(原始)工作树。

cd /path/to/other/local/repo 
git --work-tree=/path/to/other/local/repo --git-dir=/path/to/other/local/repo/.git pull

(请注意,您的第一个回购中的钩子需要指定第二个回购的work-treegit-dir,以便正常工作。)
这是一个简化的提案,因为它没有考虑您正在处理的当前分支(它假定只有一个分支'master')。
但你可以detect the branch从那里开始适应钩子(使用正确的结账并切换到右边的分支)。

在其工作树的第二次repo更新之后(通过第一个repo的post-commit钩子),第二个repo准备好作为一个原始工作树,你的预先提交钩子(你的第一个和当前的) repo)可以安全地操作。

答案 1 :(得分:0)

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

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