1

我有一台开发机器和一个远程测试服务器。

开发机器将提交文件 A + B + C 并且已经通过 SFTP(在我的编辑器中)将文件 A 和 C 发送到测试服务器。A 和 C 自上次提交以来已被修改,但自上传以来可能已修改,也可能未修改。

测试服务器具有我不想暂存或提交的未暂存(文件 A + Y)和未跟踪的修改(文件 C + Z)。

我通常在测试服务器上手动执行git checkout Arm Y撤消自上次提交以来的所有 SFTP 修改),然后拉取提交。然后我们在开发机器上有相同的 A + B 文件。

我们如何使用不需要在测试服务器上指定要 checkout/rm 的确切文件的命令来做到这一点,在现实生活场景中,在 pull 之前可能有更多文件要 checkout/rm ?

此工作流程的优点是保持 git 历史记录干净,同时使测试服务器与我正在编辑的文件保持最新。

--- 解决方案的开始 ---

git fetch
cd `git rev-parse --show-toplevel`

git diff --name-only origin/mybranch..origin/mybranch~1|cat
// for each x in last output: rm x; git co x

git stash
git pull --rebase
git stash pop
4

2 回答 2

2

如果我建议一条不同的路径,请原谅,但您的方法似乎使您的过程复杂化,超出了您可以通过集中式 git 存储库结构和良好的虚拟专用服务器实现的纯粹简单性。

就部署流程而言,我的建议非常基本:

  • 有一个中央存储库。
  • 获取对主机的 ssh 访问权限。
  • 开发期间的每个人都从中央存储库(github 或 bitbucket)中提取,具有特定的分支(live, master,等等)用于将要部署的代码,其他一切都是开发或功能分支。
  • 部署变为仅拉动。任何更改都应该在服务器外完成或复制到服务器外,然后再拉取。如果您必须在实时服务器或部署服务器上进行修补程序提交,有时这是可以理解的,但请尽快将它们推回中央存储库,因为您越不同步,最终的合并或变基就越痛苦是。
  • 理想情况下,您会调用部署脚本以从 staging/master/live 分支中提取最新更改。否则,通过 SSH 进入您的盒子以获得简单的 git 快速结帐,然后将这些文件复制到部署位置或使用简单的部署脚本。
  • 永远不要在部署中保留更改,始终在 repo 中。

同样,这需要改变观点,因为从使用 SFTP 部署切换到 ssh 并不容易,但您已经在使用 git!因此,您可能会从增加的灵活性和功能中受益。如果您确实无法通过 ssh 访问您的主机,那将是使用非开发人员友好/功能不足的主机的症状,请考虑升级的可能性!

于 2015-03-04T18:33:37.843 回答
1

git reset --hard将撤消自上次提交以来的所有修改。

git clean将清理所有未跟踪的文件(如果您也需要,不确定您是否发布)。

不过,必须说您的工作流程有点奇怪。通常您会在本地环境或虚拟化开发环境中测试您的更改。也许您应该遵循 Kzqai 的建议并更改您的工作流程。

于 2015-03-04T18:34:31.680 回答