使用 rsync 镜像源以进行网站部署,但不删除目标中选定的文件

使用 rsync 镜像源以进行网站部署,但不删除目标中选定的文件

我已经为此工作了好几天了,无论我做什么,我都无法让它发挥作用。我几乎阅读了 StackExchange 网络上有关 rsync 的所有问答,但仍然没有找到答案。

基本上我正在编写一个网站部署工具,它使用 rsync 从源 Git 存储库移动文件来部署 Git 存储库;目的地。提交部署存储库实际上会将代码部署到 Web 服务器,因此我在两个不同目录之间使用 rsync 进行延迟。

开发人员在源存储库中删除的任何文件也会在部署存储库中删除,这一点非常重要。但是,部署存储库中有一些选定的文件需要不是具体来说,这些文件是托管提供商提供的并且在生产中需要,但在源存储库中维护时存在问题。

根据我在 、此处和其他地方读到的内容,我了解到man,如果我将部署/目标存储库中我想要保留的文件的名称添加到文件--exclude-from

基本上,这就是我正在做的事情:

rsync --archive --verbose \
      --exclude ".git" --exclude ".git*" \
      --exclude-from="/tmp/excludes.txt" --delete-after \
      /dir/to/source/repo/ \
      /dir/to/deploy/repo

出于示例目的,我们假设这是以下内容/tmp/excludes.txt

/foo/bar/baz.php

现在,当我在本地使用一个简单的示例尝试此操作时,它似乎总是按预期工作。但是当我在实际部署场景中将其与 CircleCI 一起使用时,总是在运行上述命令后rsync删除。/foo/bar/baz.php

你能看到我做错了什么吗?提前致谢。

更新 - 以上确实有效

事实证明,我在 CircleCI 中运行的脚本中的逻辑有问题,但我只是看不到它。我正在使用不同的根运行多个 rsync 命令(本质上是我的主根的子目录)因为需要不同的规则,以及一份包含所有基于主根的文件路径的排除文件列表。啊。

不管怎样,亲爱的读者,结果是上面的例子确实按照我描述的我希望它如何工作的方式工作。

答案1

只是为了结束循环,如果有人阅读本文想知道如何使用 rsync 将目标目录与源目录镜像除了特定命名的文件这就是你要做的:

rsync --archive --verbose \
      --exclude-from="/tmp/excludes.txt" --delete-after \
      /dir/to/source/repo/ \
      /dir/to/deploy/repo

/tmp/excludes.txt这是其中指定文件的完整文件路径的内容/dir/to/deploy/repo/foo/bar/baz.php

/foo/bar/baz.php

相关内容