我有一个 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 ...