正如我的问题所述,在更改文件并在存储库中添加新文件后,我通常使用git提交文件,但有时出于组织原因,我需要将所有已修改/更改的文件复制到文件夹中。
有什么选择吗?
正如我的问题所述,在更改文件并在存储库中添加新文件后,我通常使用git提交文件,但有时出于组织原因,我需要将所有已修改/更改的文件复制到文件夹中。
有什么选择吗?
Answers:
假设您尚未提交,并且想打包当前已进行本地修改的所有文件,则可以使用来获取已修改文件的列表git ls-files --modified。如果要使用上次提交更改的文件,可以使用git diff --name-only HEAD^。从那里到哪里,取决于您。例子:
zip modified-files.zip $(git ls-files --modified)
cp $(git ls-files --modified) ../modified-files
请注意,这当前正在使用工作树中的文件版本。
如果文件名中有空格,则将不得不麻烦一点。
(当然,根据您的实际意图,您可能正在寻找 git stash,它将藏匿所有已修改的文件并留下干净的工作树,或者您可能只是想制作一个临时分支来提交。 )
要完全按照您的要求进行操作(假设您已经提交并想要创建上次提交更改的文件的存档),可以执行以下操作:
git archive --format=zip HEAD `git diff HEAD^ HEAD --name-only` > a.zip
如果您已删除提交中的文件,为防止出现pathspec错误,请使用--diff-filter=d:
git archive --format=zip HEAD `git diff --diff-filter=d HEAD^ HEAD --name-only` > a.zip
但是也许您实际上想使用以下方法创建补丁:
git diff HEAD^ HEAD > a.patch
并使用以下命令在需要的地方应用此补丁:
patch -p1 < a.patch
当然,仅当目标目录已包含存储库的旧版本时,才应用补丁。
git format-patch而不是管道git diff传输文件
git archive --format=zip HEAD `git diff HEAD~2 HEAD --name-only` > a.zip
假设您没有删除或重命名文件,这应该可以解决问题
复制:
cp --parents $(git status -s | egrep "M|A|AM" | rev | cut -d" " -f1 | rev) destination_folder
压缩:
zip modified.zip $(git status -s | egrep "M|A|AM" | rev | cut -d" " -f1 | rev)
egrep: repetition-operator operand invalid。😞–
这是一个脚本,它可以使此过程更加轻松,它将所有更改的文件复制到使用的已定义目录中,并维护代码库的目录结构。
运行:sh scr.sh
================================================
#!/bin/sh
FILES=`git ls-files --modified`
for x in $FILES
do
prev_dir=$PWD
echo "MY Dir = $prev_dir"
mkdir -p $1/$x
cd $1/$x
cd ../
rm -r *
cp $prev_dir/$x ./.
cd $prev_dir
done
================================================