【发布时间】:2019-06-07 21:03:48
【问题描述】:
我遇到了一个问题,我认为最好的解决方案是捕获项目的当前状态并将其应用于新分支中的新提交。
以下是我的 git 工作流程的概述:
- 我在我的机器上保留了我们的 origin/master 分支的本地副本,我将其称为 local/master。
- 在调试我自己的本地/功能分支中的更改时,我使用本地/主服务器进行比较。例如,如果我发现我的本地/功能分支中存在错误,我可能会切换回本地/主分支以查看它是否在那里重现。这让我知道该错误是预先存在的还是由我自己的更改引起的。
- 当在 origin/master 和我的 local/feature 分支之间执行合并时,我还使用 local/master 作为中间暂存分支。这可以防止源分支(主分支)成为移动目标,以防我需要放弃合并并重新开始。
- 我只通过从 origin/master 拉取来更新 local/master。每当其他开发人员将他们自己的更改合并到 origin/master 时,都会执行此操作。
- 我通过从本地/功能推送到源/功能并将合并请求从源/功能提交到源/主来提交我的代码。
以下是导致这种情况的时间顺序:
- 我从 local/master 分叉了一个分支作为 local/feature1。
- 我对 local/feature1 做了几次提交。
- 一项功能已合并到 origin/master,它将一些 .pem 文件(公钥/私钥)从一个目录移动到另一个目录。
- 向源(私有 Gitlab 实例)添加了一个钩子,该钩子阻止了任何后续的 .pem 文件被签入。
- 我从 origin/master 拉到 local/master。
- 我从 local/master 合并到 local/feature1。
- 我对 local/feature1 进行了多次提交。
- 我尝试将我的代码从 local/feature1 推送到 origin 作为 origin/feature1。
- origin 抱怨不允许我签入 .pem 文件。
我相信这种情况正在发生,因为 local/feature1 中的提交历史现在包含一个合并提交,其中包含 .pem 文件更改。这个文件是在实现钩子之前添加到 origin/master 的,所以它不受钩子限制。但是,随后将合并提交到我的分支中以及我的代码更改一起提交,因此它被钩子标记了。
此时我想从 local/feature1 的提交历史记录中删除 .pem 文件,而不实际删除这些文件。此时重新设置和压缩提交不会解决问题,因为 .pem 文件已经存在。删除 .pem 文件无济于事,因为它们实际上需要在项目中(不相关的故事)。将我的分支恢复到未合并状态也不是一种选择,因为上传的源/功能将与源/主服务器太旧,以至于审查没有意义。
显而易见的解决方案似乎是:
# Copy current state of the project to a backup directory
cp -r . ../backup
rm -rf ../backup/.git
# Reset project to latest official state
git checkout local/master
git pull
# Regenerate local branch so the merged changes aren't included as local commits
git branch -D local/feature1
git checkout -b local/feature2
# Copy the desired project state back in and commit it
cp -rf ../backup/. .
git add --all
git commit -m "Regenerating feature branch"
rm -rf ../backup
# Upload without being restricted by hook
git push --set-upstream origin feature2
我觉得应该有一种方法可以在本地使用 git 来执行此操作,而无需直接弄乱文件系统。这样做有什么魔术吗?也许通过git stash?
【问题讨论】:
-
你试过
git stash --include-untracked来存储未跟踪的更改和跟踪的文件吗?此外,充分利用这些钩子脚本将凭据保留在存储库之外。 -
这不起作用,因为我要存储的文件已经被跟踪和提交(在合并提交之前、期间和之后)。我只知道如何让 git stash 从分支的 HEAD 抓取更改。
标签: git git-merge githooks git-stash