我最近开始使用Git作为我公司网站文件的版本控制系统和部署工作流程。我还没有找到一种简单的方法来备份Commit中的更新文件(这样每次都不会对所有项目文件进行冗余备份),而且我已经集思广益了一种方法来输出文件。使用以下命令提交:
git show --pretty="format:" --name-only {COMMIT_ID}
...其中{COMMIT_ID}
是提交的8个字符的ID。
这个工作,并以一种很好的方式输出文件,每行一个文件。
我想要做的是捕获此输出的每一行,例如:
/a/b/c/file1.txt
/a/b/c/d/file2.txt
/x/y/file3.txt
/x/y/z/file4.txt
...并在此输出的每一行上执行以下终端命令,以使用rsync
制作每个文件的副本:
rsync -aR ~/Git/repo/./{OUTPUT_LINE} ~/Commit/repo/{COMMIT_ID}/
...其中{OUTPUT_LINE}
是输出的这一行(例如/a/b/c/file1.txt
),而{COMMIT_ID}
是之前提交的8个字符的ID。
如何在终端命令的多行输出的每一行结果上运行命令?
我熟悉|
管道,但仅限于基础层面,我不知道如何利用它。
扩展我的rsync
命令:这将从我的本地目录中获取diff文件,该目录包含Git repo文件,创建文件的目录结构,并一次性复制文件。没有同步。
我计划在AppleScript中使用此备份工作流程,在对话框中请求提交ID,以便快速复制,粘贴和转发。然后它将运行终端命令,并在完成时触发最后一个提示。
将执行此备份的完整系列终端命令如下:
mkdir ~/Commit/repo/{COMMIT_ID} cd ~/Git/repo git show --pretty="format:" --name-only {COMMIT_ID} rsync ...
说明:
~/Commit/repo/
备份文件夹rsync
文件到备份文件夹答案 0 :(得分:1)
xargs
是你的朋友:
git show --pretty="format:" --name-only "$COMMIT_ID" |
xargs -L 1 -I FILENAME rsync -aR ~/Git/repo/./FILENAME ~/Commit/repo/"$COMMIT_ID"/
选项:
-L 1
- 一次读取一行输入,而不是默认值,以便在命令行中输入尽可能多的输入项。-I FILENAME
- 使用字符串" FILENAME"作为输入项的占位符。