我在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 / *”的文件,该文件不存在。
答案 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 {} .