将已跟踪和未跟踪的文件移动到子目录

时间:2015-06-20 21:24:41

标签: git

我有一个包含许多文件和文件夹的git存储库,其中一些是在git中跟踪的,而另一些则不是。我想将所有内容移动到子目录(即mv * subdir/的结果),但让git识别出被跟踪的文件只是被移动了。我不想手动将所有存储库文件重新添加到新位置的git中。

我尝试了一些天真的可能性,例如git mv * subdir/(失败,因为git mv不会移动未跟踪的文件),但如果有一种简单的方法可以实现这一点,则无法解决。有人可以推荐一个吗?

5 个答案:

答案 0 :(得分:4)

使用git mv

可以轻松实现此目的
git mv -k SOURCE... DESTINATION
mv -n SOURCE... DESTINATION

这将首先移动所有跟踪的文件,然后移动未跟踪的文件。这不会覆盖任何东西。

如果你想覆盖:

git mv -fk SOURCE... DESTINATION
mv -f SOURCE... DESTINATION

mv && git add

不同,最终结果会按预期保留文件的跟踪/未跟踪属性

供参考,文档:

git mv -k

  

跳过移动或重命名可能导致错误情况的操作。如果源既不存在也不受Git控制,或者除非给出-f,否则会覆盖现有文件时发生错误。

git mv -fgit mv --force

  

即使目标存在,也强制重命名或移动文件

mv -nmv --no-clobber

  

不要覆盖现有文件

mv -fmv --force

  

覆盖前不要提示

答案 1 :(得分:0)

一般情况下,如果您手动移动文件(不使用git命令行),然后git rm old-filenamegit add new-filename,git会识别文件已移动而不是删除并创建新文件

答案 2 :(得分:0)

如果您只是将文件移动到新的子目录中,Git应该能够处理。

mv <list-of-files> <dest>
git add dest

git status应将已跟踪的文件显示为已重命名。

答案 3 :(得分:0)

我用一个比我想象的更简单的bash单行解决了这个问题。运行mv * subdir/后:

git status | grep deleted | sed "s/ *deleted: */subdir\//" | xargs git add

如果不清楚,这只会添加以前在repo中的所有内容,将旧文件路径替换为新文件路径。

如果使用git有更自然的方法,我仍然会感兴趣。 缺点是它实际上并没有意识到文件只是被移动了,即使它们的内容没有改变。

编辑:如果我还git rm旧文件路径,则会正确检测到重命名。

答案 4 :(得分:0)

这个怎么样:

  • 在新位置手动制作(正常)完整副本
  • 调用git mv * subdir/ -f(注意-f标志)将更新git和覆盖文件,但技术上没有区别。
  • 从旧位置手动删除文件