0

我们正在将 SVN 迁移到 Git。在一个项目上。

一切都很好,但是我在保留一些未跟踪(忽略)的目录和文件的权限(文件模式)方面遇到了问题。我们以下流程:

  • 清理 SVM 存储库(整理、清理未提交的内容等)
  • 本地环境上的 svn2git(从联网的 SVN 迁移 - 所以最新版本,没有进一步的提交,这确实包括正确的authors.txt映射和对分支、标签等的正确跟踪)
  • 创建被忽略的文件和目录 li (.gitignore)st - 部分自动化svn propget,手动完成(逐行)
  • 添加遥控器并推送到它(我们使用的是 github,但它应该无关紧要)

    在这个阶段遥控器已经准备好,所有的历史都被转换了。现在是我想在不更改目录、移动文件或创建符号链接的情况下热迁移服务器部署的困难部分。假设有两个镜像环境位于两台不同的服务器上——一个用于测试版,一个用于生产版。让我们说目录是/var/www/depl/例如/。问题是,作为每个 Web 项目,都有我们不需要跟踪的目录和文件。 我将用命令编写我的步骤,因为我认为它也可以成为其他人的一个很好的指南。所以在服务器上的策略是:

  • 去那里cd /var/www/depl/

  • 通过备份到另一个目录rsync并按原样保留权限!
  • 递归删除所有 .svn 目录find -type d -name .svn -exec rm -rf {} \;
  • 初始化一个空的 git 存储库git init(注意我们没有使用“裸”存储库)
  • 添加 GitHub 远程并将其命名为“origin”,同时下载所有分支git remote add -f https://github.com/ORG/REPO
  • 检查状态(本地副本应该是干净的)
  • 拉(所以 fetch + merge 但它实际上只是一个合并git pull origin master

这最后一步破坏了我的权限。还记得那些我不想/不需要跟踪的文件吗?现在看来,这些人的权限已被修改。它们都被正确地忽略了,但是当我应用拉/合并时它会中断。好的,确定问题来自远程存储库并通过合并。这不是问题,而是文件是如何提交的(使用什么文件模式)。

问题是: 在最后一步,拉取更新时,我可以指示 git 保留所有文件的当前文件权限吗?如在当前目录中并递归向下? 所以:不要更改任何本地权限?

是的,也许我之后会有一个差异和一些东西要提交,但这并不是一个大问题,因为权限被破坏了。

所以?有办法吗?服务器当然运行 Linux。

提前致谢。

干杯!

4

1 回答 1

0

好吧,我设法找到了一种方法。正如我所想,“秘密”在于使用rsync. 我实际上解决了我的问题,而我正在写这个问题。:)

无论如何,经过一些研究,事实证明,只要时间戳没有改变rsync --archive,就会更新目标的权限。SAMBA邮件列表帮助很大!先决条件是您确保这些目录中的任何内容都不会更改-因此将网站置于维护模式,停止所有 crons。让它无法访问,这样你以后就不会头疼了。

迁移(在将所有历史迁移到 git 之后)步骤如下:

  • 将您的生产环境带到您想要的 SVN 阶段 - 更新、签出等。确保这与 incommig git 副本相同和/或将您的更改保存在补丁中。
  • 使用 rsync 备份部署目录rsync -av --progress /var/www/depl/ /var/www/deplBackUp1/- 注意这包括 .svn 目录
  • 删除 .svn 目录:cd /var/www/delp/ find -type d -name .svn -exec rm -rf {} \;
  • 现在在不同的位置再次备份rsync -av --progress /var/www/depl/ /var/www/deplBackUp2/- 目标是有两个副本
  • 初始化新的 git repogit init
  • 添加遥控器git remote add -f REMOTE_NAME https://github.com/ORG/REPO
  • 从您想要的分支中提取所有内容git pull origin master
  • 现在 rsync 从你的(no-.svn dir backUp)返回rsync -av --progress /var/www/deplBackUp2/ /var/www/depl

您可能还想研究使用裸 git 存储库进行服务器部署。

最后一步将解决您使用新 VCS 创建的任何文件模式问题。如果您需要这样做并遇到麻烦,请在评论中标记我 - 我会尽力提供帮助。干杯!

于 2014-10-14T09:41:32.923 回答