Git 将所有根目录移到子文件夹中

Git 将所有根目录移到子文件夹中,git,Git,在MyGitRepo中,应用程序位于根文件夹中,如 .gitignore pom.xml data/ src/ README.md ... 由于重新设计了应用程序(其中一部分是引入父pom),因此我希望将所有内容移动到一个子文件夹中,如system,然后创建第二个文件夹(如api): 将所有内容移动到系统的最佳方式是什么?根目录中每个文件/目录的git mv是否足够?我首先使用git ls files获取git跟踪的所有文件,然后循环它们,将每个文件移动到新的system/目录: git ls

在MyGitRepo中,应用程序位于根文件夹中,如

.gitignore
pom.xml
data/
src/
README.md
...
由于重新设计了应用程序(其中一部分是引入父pom),因此我希望将所有内容移动到一个子文件夹中,如system,然后创建第二个文件夹(如api):


将所有内容移动到
系统
的最佳方式是什么?根目录中每个文件/目录的git mv是否足够?

我首先使用
git ls files
获取git跟踪的所有文件,然后循环它们,将每个文件移动到新的
system/
目录:

git ls-files | for f in $(cat -); do git mv $f system; done

只需将所有内容(除了
.git
目录)移动到新文件夹中,运行
git add--all
,然后提交即可

在我的例子中,本要点中描述的解决方案对我有效(它保留了移动文件夹的子目录结构):


相关命令是:
for file in$(ls | grep-v'system');dogitmv$文件系统;完成

为了改进Markus和tlehman的anser,使其与副董事一起工作,我做了这个 将EverythSign移动到名为“subdir”的文件夹中

git-ls文件|\
以美元(类别-)表示的f;做
mkdir-p$(dirname“subdir/$f”)
git mv“$f”子目录/f”
完成
然后跑

git clean-fd
删除旧的目录项


提示:在Zsh中,您可以使用alt+enter跨多行。Bash似乎没有一个等价物。(我想你可以用
;\
结束这一行,你可以添加更多命令)

你也可以用标准bash命令将文件移动到系统中(只是“mv”而不是“git mv”),然后将更改提交到你的存储库中,否?请定义“best”。“best”:在不破坏repo的情况下保留更改/提交消息:)这不就是使结构扁平化吗?我不明白这是怎么回事?至少在装有git bash的Windows 7上不起作用。它将所有没有子目录的文件展平到目标目录中。不是Windows上的解决方案,将文件/文件夹移动到子文件夹,然后执行git添加--所有这些都将在git中创建“删除/添加操作”(而不是“重命名操作”),这将破坏历史记录。似乎必须使用git mv来防止文件级的历史记录丢失,至少在Windows上是这样。@EmilG,您尝试过这两种方法并看到了区别吗?因为git实际上并不存储“动作”;它只存储目录的快照,并根据差异确定“操作”。
git mv
基本上是手动移动文件/dir和执行
git add的快捷方式——所有这些都是
是的,您可能是对的,仔细看这两种方法,我认为它们产生的结果与您所说的相同。谢谢你的澄清。
git ls-files | for f in $(cat -); do git mv $f system; done