Git将目录中的所有内容移动到一个目录中

时间:2017-05-10 12:35:48

标签: git

我在Windows 7上并且具有这种简单的结构

+ gitroot
|- someDir
|-- lots
|-- of
|-- other
|-- stuff

我想将someDir中的所有内容都移到gitroot中。

这及其某些变体不起作用

gitroot > git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working tree clean

gitroot > git --version
git version 2.9.2.windows.1

gitroot > git mv someDir\* .
fatal: bad source, source=someDir/*, destination=*

gitroot > git mv someDir/* .
fatal: bad source, source=someDir/*, destination=*

gitroot > git mv someDir/* ./ -k 

最后一个不会抛出错误,但也不对我的文件系统做任何事情。我也试图完全写出路径但没有成功。

我不知道gits是什么问题,并且很难将它传达给我。

编辑:我找到了someDir / *无效的原因。我正在使用的shell不是通配符,因此git正确地希望移动一个名为“someDir / *”的文件,该文件不存在。

2 个答案:

答案 0 :(得分:2)

我认为问题是git期望你的shell扩展*,这是没有发生的。如果你使用git bash,它应该。或者您可以尝试手动列出要移动的目录,但听起来好像有很多这样可能不太好。

如评论中所述,一个简单的解决方法是使用OS命令而不是git来移动文件,然后执行git add .。这实际上就是git mv所做的所有事情(因此我从不打扰git mv。(编辑:澄清一下,在这种情况下,这就是所做的一切。有些情况,比如子模块,其中git mv提供了很好的自定义管理细节。)

在评论中,您表达了对失去历史的担忧。事实是,无论您是否使用git mv,git都会将更改记录为“旧路径中的文件已删除;新路径中的新文件”。它试图推断出事实上这确实是“文件从旧路径转移到新路径”,并且无论你使用哪个命令进行移动,它都有正确推断这一点的机会。

答案 1 :(得分:1)

git mv的帮助说:

  

它重命名,必须存在,并且可以是文件,符号链接或目录

someDir\*不是现有文件,符号链接或目录,除非您实际拥有名称相同的文件,符号链接或目录。这正是错误告诉你的。源不是现有文件,符号链接或目录。

要使它工作,你可以做

mv someDir/* . && git add .

或者在Git Bash中执行它,它已经扩展了*,但是你需要

git mv somedir/* somedir/.* .

在bash *中不会泄露隐藏文件(即以.开头的文件)。

或者,您也可以手动展开文件并单独移动它们,如

git ls-tree --name-only @ gitspindle/ | xargs -ri git mv {} .