【发布时间】:2021-02-18 22:50:16
【问题描述】:
我只想scp git 存储库中跟踪的文件。
例如,git ls-files 命令的输出如下:
$ git ls-files
someFile
src/file1.txt
src/file2.txt
anotherFile
scp 接受这样的输入:scp someFile src/file1.txt src/file2.txt anotherFile <destination>,我可以使用 scp $(git ls-files) <destination> 生成它。这样做的问题是,只是将所有文件转储到 <destination> 而不维护文件夹结构。我想为此使用scp -r,但我不知道如何过滤文件,以便仅复制使用git ls-files 命令显示的文件。也许有一些方法可以为此使用xargs...
【问题讨论】:
-
请注意,
scp $(git ls-files) destination有一些严重的错误(除非您关闭 globbing 并事先修改IFS-- 即便如此,它也只有使用git才安全,它不允许文件名包含换行符,而 一般 在 UNIXy 系统上允许换行符)。如果您的文件名包含空格或全局字符,它们将被拆分为多个参数。这部分在BashPitfalls #1 中进行了讨论。 -
...这是
xargs -d $'\n'可以解决的问题,如果您使用的是 GNU 风格的系统,尽管在值的情况下(像这样)正确使用需要一些注意被替换为非最终位置;一些“明显”和常见的使用模式有自己的安全漏洞(从不使用xargs -I{} sh -c '...{}...')。