将 gitignored 文件从主机 A 复制到主机 B(rsync?)

将 gitignored 文件从主机 A 复制到主机 B(rsync?)

我有一个 git 存储库,其中包含敏感信息的多个文件被 gitignored。这些文件位于不同深度的不同子目录中。

主持人A所有这些文件都已就位。我已将存储库克隆到主机上,并且正在寻找一种从主机复制 gitignored 文件的好方法A

我可以通过 SSH 访问A,我怀疑有一种方法可以使用 rsync 来做到这一点,但我发现的所有示例都描述了相反的操作:同步所有内容除了gitignored 文件。

答案1

在 git 项目目录中使用git check-ignore **/*会导致 git 忽略所有文件。

您应该将 git 命令的输出发送到文件并使用命令--files-from中的选项rsync。例如:

git check-ignore **/* > ignoredFiles
rsync -a --files-from=./ignoredFiles . host:/path/to/ignoredFiles

您必须指定点(.rsync忽略的文件文件),因为这代表源目录,它将成为 git 项目的根目录。


该命令git check-ignore **/*仅对我有用zsh(我不确定为什么在 bash 中它不起作用)。但是,使用该命令不适用于隐藏文件,因此如果您也想排除隐藏文件,您可以使用:

find . -exec git check-ignore {} + > ignoredFiles
rsync -a --files-from=./ignoredFiles . host:/path/to/ignoredFiles

将被忽略的文件重定向到某个文件并使用 --files-from 读取它们似乎是安全的,因为带有空格的文件名被正确复制(但我不确定其他特殊文件名)。

答案2

我最终使用了 rsync,而不是尝试枚举所有 gitignored 文件,而是同步了整个目录(不包括 .git/),并用于--ignore-existing避免同步目标中已存在的文件:

rsync -avz --no-links --ignore-existing --exclude='.git/' \
    ~/example/repo user@host:example

我还发现 rsync 的--dry-run选项与-vv测试调用rsync并确保它会同步我想要的文件非常有用,

rsync --dry-run -avvz ...

相关内容