我有一个包含许多文件和文件夹的git存储库,其中一些是在git中跟踪的,而另一些则不是。我想将所有内容移动到子目录(即mv * subdir/
的结果),但让git识别出被跟踪的文件只是被移动了。我不想手动将所有存储库文件重新添加到新位置的git中。
我尝试了一些天真的可能性,例如git mv * subdir/
(失败,因为git mv
不会移动未跟踪的文件),但如果有一种简单的方法可以实现这一点,则无法解决。有人可以推荐一个吗?
答案 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 -f
(git mv --force
)
即使目标存在,也强制重命名或移动文件
mv -n
(mv --no-clobber
)
不要覆盖现有文件
mv -f
(mv --force
)
覆盖前不要提示
答案 1 :(得分:0)
一般情况下,如果您手动移动文件(不使用git命令行),然后git rm old-filename
和git 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和覆盖文件,但技术上没有区别。