我只想获得两个修订版之间已更改文件的列表,这很简单:
git diff -–name-only commit1 commit2 > /path/to/my/file
Run Code Online (Sandbox Code Playgroud)
但是,如果我想将所有列出的文件复制到另一个地方,我该怎么写?我需要完全相同的目录结构复制文件.
例如,我修改并添加了文件:
/protected/texts/file1.txt
/protected/scripts/index.php
/public/pics/pic1.png
Run Code Online (Sandbox Code Playgroud)
我希望在/home/changes/所有更改和添加的文件中包含:
/home/changes/protected/texts/file1.txt
/home/changes/protected/scripts/index.php
/home/changes/public/pics/pic1.png
Run Code Online (Sandbox Code Playgroud)
Yor*_*ork 113
尝试以下命令,我测试过:
$ cp -pv --parents `git diff --name-only` DESTINATION-DIRECTORY
Run Code Online (Sandbox Code Playgroud)
Mar*_*air 13
以下应该工作正常:
git diff -z --name-only commit1 commit2 | xargs -0 -IREPLACE rsync -aR REPLACE /home/changes/protected/
Run Code Online (Sandbox Code Playgroud)
进一步解释:
在-z与git diff --name-only同NUL分隔的文件的方式输出列表字节而不是换行,以防万一您的文件名中都有特殊字符.
该-0到xargs说,解释标准作为输入参数的NUL分隔的列表.
这-IREPLACE是必需的,因为默认情况下xargs会将参数附加到rsync命令的末尾.相反,它说要把它们放在后者的REPLACE位置.(这是服务器故障答案的一个很好的提示.)
在-a对参数rsync的手段维护权限,所有权等如果可能的话.的-R手段来创建在目标文件时使用完整的相对路径.
更新:如果您有旧版本xargs,则需要使用该-i选项而不是-I.(前者在以后的版本中被弃用findutils.)
kol*_*pto 11
这是一个单行:
列出已更改的文件并将其打包为*.zip:
git diff --name-only | zip patched.zip -@
Run Code Online (Sandbox Code Playgroud)
列出上次提交的已更改文件并将其打包为*.zip:
git diff --name-only HEAD~ HEAD | zip patched.zip -@
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
145826 次 |
| 最近记录: |