对已提交的未跟踪文件应用存储

Apply stash with untracked files already committed

我被要求为 post 中的 运行 编写一个脚本-Visual Studio 中的构建事件将通过提交所有更改来响应输出更新构建,包括新的(未跟踪的)文件,到本地 "autocommit" 分支。这个想法是为了帮助懒惰的开发人员经常备份可构建的代码,这样他们就可以避免丢失他们的工作。

我目前的方法(见下面的片段):

如果用户不在自动提交分支上,我会存储他们的更改和未跟踪的文件,检出自动提交分支,应用存储,并在return进入前一个分​​支并从隐藏到 return 到初始状态。

我的问题:

如果文件在用户的当前分支上未被跟踪,但已经被自动提交到自动提交分支,那么 git stash apply 无法用藏起来。

git stash documentation 看来,似乎没有任何相关参数可以用于 apply 调用来解决这个问题。通过解析 git status --porcelain?? 开头的行的结果,我可以在隐藏之前检测到当前分支中未跟踪的文件,但这不会告诉我哪些文件已经在自动提交分支上被跟踪.

我目前需要使用 Windows 批处理文件,因此我想将我的解决方案限制为在任何开发机器上的该环境中可能可用的工具。

这是我当前方法的相关片段:

git stash save --include-untracked -keep-index
git checkout autocommit
git stash apply
git add -A
git commit -m "Autocommit of build %VERSION%"
git checkout  %BRANCHNAME%
git stash pop

偏离git哲学

自动提交过程旨在提供便利,基于 git 的自动保存系统,不需要开发人员触摸 git 或采取任何额外的手册每次他们成功重建项目时的步骤。

它不符合正常的 git 哲学,因为它不打算用于源代码控制或代码共享。我只是想使用 git 为开发人员提供快照以恢复到例如如果他们失去了他们的项目以提交腐败文件。这将导致大量微小的提交而个人价值很小,这没关系 - 事实上,它非常适合我的需要。

脚本假定当前分支上未提交的更改可以明智地应用并提交到自动提交分支。假设无效的任何原因都是由开发人员与 repo 的直接交互引起的。作为任何此类交互的一部分,开发人员负责相应地更新自动提交分支,以便脚本的假设在下次 运行.

时有效。

我发现您的方法存在一些潜在问题:

  1. git stash apply on autocommit 可能会产生需要手动解决的冲突。这将从整个过程中取出 "automatic"。
  2. 不保证 autocommit 上的提交与当前工作副本相同,因为 git stash apply 执行合并。

以下顺序应该可以解决这两个问题并回避您原来的问题。

git stash -u
git stash apply
git add -A
git commit -m "dummy"
git merge --no-ff autocommit -s ours
git checkout autocommit
git merge - --squash
git commit -m "Autocommit of build %VERSION%"
git checkout -
git reset --hard HEAD~2
git stash pop

解释:

  1. 保存工作副本的当前状态。
  2. 带回工作副本。
  3. 舞台一切
  4. 在当前分支上进行虚拟提交。这将被复制到“autocommit”并随后从当前分支中删除。
  5. autocommit 与我们的更改合并,以便于移动更改。 ours 策略确保合并的结果与我们要保存的工作副本的状态相同。永远不会有与此策略的合并冲突。由于没有 theirs 策略,因此无法将此合并到 autocommit 中。
  6. 移动到 autocommit 分支。
  7. 将更改引入分支。 --squash 选项很重要。没有提交,而是暂存所有更改。
  8. 提交分阶段更改。
  9. 往回走。
  10. 删除虚拟提交和合并提交。
  11. Return原来的状态。

结果应该是在 autocommit 上代表工作副本的单个提交。

请注意,此脚本可能会提交大量垃圾(构建文件)。 autocommit 分支对于不同的开发者也会有很大的不同。我建议它保留在本地,以避免使原始存储库膨胀。如果您必须推送它,请尝试为每个开发人员提供自己的分支名称以避免冲突。