还是先吐槽一下,公司有个项目最近搞数据库迁移,所以分裂出了另外一个项目。你要问为什么不重开一个分支就行,那我也不知道,因为仓库不是我在管理。
这两个项目是要同时运行的,所以老版本有什么更新的话,也要同步到新项目中去,每次都需要把改动在新项目复刻一遍,是真的离谱,虽然也有可能是我的方法不对~
在改动很小的时候觉得没什么,但这次我面临的是几十个文件的改动,总不能一个一个改吧。幸好现在有 AI,顺利帮我解决了这个问题,就是把 commit 中的文件包括目录都给你复制出来,这样就能直接丢到新项目覆盖原文件(git不会认为是新增的文件,而是修改后的文件),然后直接 commit 就可以了~
话不多说,直接上 git 命令:
git diff --name-only HEAD~2..HEAD | xargs -I{} cp --parents {} <destination_directory>
1
是不是看起来挺复杂的,直接用一个例子来说明,比如下面这一条:
git diff --name-only HEAD~2..HEAD | xargs -I{} cp --parents {} ./copy/
1
这里是对每个参数的解释:
- git diff: Git命令,用于查看提交之间的差异。
- --name-only: 这是git diff命令的一个选项,用于只显示文件名而不显示具体的差异内容。
- HEAD~2..HEAD: 这是指定要比较的提交范围,表示最近两次提交(commit)到当前位置 (HEAD) 的差异。HEAD~2 表示倒数第二次提交,HEAD 表示最后一次提交。
- |: 管道操作符,将前一个命令的输出传递给下一个命令作为输入。
- xargs: 命令,用于从标准输入读取数据,并将其作为参数传递给另一个命令。
- -I{}: xargs的选项,将占位符 {} 用实际的参数值替换。
- cp: Unix命令,用于复制文件和目录。
- --parents: cp命令的选项,用于在目标目录中创建源文件的父目录结构。
- {}: 是由 xargs 中的 -I{} 占位符所代表的参数,即文件名或路径。
- ./copy/: 目标文件夹的路径,用于存储复制出来的文件。
通过以上命令组合,我们能够获取最近两次提交的文件差异,并使用 xargs 将这些文件复制到指定的目标文件夹中(包括原始目录结构)。
请注意,在运行此命令之前,请确保您当前位于正确的Git仓库根目录,并且已经存在名为 copy 的目标文件夹。
这样就完美解决问题啦,没想到 git 还有这种操作,学习了,有了 AI 的帮助工作效率还是能提高不少的~