Answers:
git最好的事情之一就是您不需要显式跟踪文件重命名。Git将通过比较文件内容来弄清楚。
因此,就您而言,不要那么努力:
$ mkdir include
$ mv common include
$ git rm -r common
$ git add include/common
运行git status应该显示以下内容:
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# renamed: common/file.txt -> include/common/file.txt
#
git mv是等效的。
git mv common include
应该管用。
git mv [-f] [-n] [-k] <source> ... <destination directory>
在第二种形式中,最后一个参数必须是现有目录。给定的源将移动到此目录中。
成功完成后,索引将更新,但更改仍必须提交。
移动前git add请勿进行任何“ ”操作。
注意:“ git mv A B/”(当B不存在于目录中时)应出错,但不存在。
见提交c57f628由马修莫伊(moy)为GIT中1.9 / 2.0(Q1 2014):
Git用来修剪尾斜杠,并使命令等效于'
git mv file no-such-dir',从而创建了文件no-such-dir(而尾斜杠明确声明了它只能是目录)。此修补程序跳过了目标路径的尾部斜杠删除。
带有斜杠的路径将传递给rename(2),该错误会因相应的消息而出错:
$ git mv file no-such-dir/
fatal: renaming 'file' failed: Not a directory
git mv外观似乎是更好的方法!
命令:
$ git mv oldFolderName newFolderName
通常正常。
错误“错误的源...”通常表示在最后一次提交之后,源目录中有一些重命名,因此git mv找不到所需的文件。
解决方案很简单-只需在应用之前提交即可git mv。
我在git mv将一个文件夹的内容移动到现有文件夹中时遇到了类似的问题,并最终得到了这个“简单”脚本:
pushd common; for f in $(git ls-files); do newdir="../include/$(dirname $f)"; mkdir -p $newdir; git mv $f $newdir/$(basename "$f"); done; popd
git ls-files:查找所有common签入git的文件(在文件夹中)newdir="../include/$(dirname $f)"; mkdir -p $newdir;:在该include文件夹内新建一个文件夹,其目录结构与commongit mv $f $newdir/$(basename "$f"):将文件移到新创建的文件夹中这样做的原因是git似乎无法将文件移至现有文件夹,并且如果您尝试将文件移至不存在的文件夹也会失败(因此 mkdir -p)。
这种方法的好处是,它仅涉及已签入git的文件。通过简单地使用git mv移动整个文件夹,并且该文件夹包含未暂存的更改,git将不知道该怎么做。
移动文件后,您可能需要清理存储库以删除所有剩余的未登台的更改-请记住要先空运行!
git clean -fd -n
抱歉,我没有足够的声誉来评论“ Andres Jaan Tack”的“答案”。
我认为我的信息将被删除((但我只想警告“ lurscher”和其他遇到相同错误的人:请谨慎
$ mkdir include
$ mv common include
$ git rm -r common
$ git add include/common
这可能会导致您在新文件夹中看不到项目的git历史记录。
我试过了
$ git mv oldFolderName newFolderName
得到
fatal: bad source, source=oldFolderName/somepath/__init__.py, dest
ination=ESWProj_Base/ESWProj_DebugControlsMenu/somepath/__init__.py
我做了
git rm -r oldFolderName
和
git add newFolderName
而且我在项目中看不到旧的git历史记录。至少我的项目没有丢失。现在我的项目在newFolderName中,但是没有历史记录(
只是想警告,如果您不想失去git hsitory,请谨慎使用“ Andres Jaan Tack”的建议。
我有类似的问题,但是在我想移动的文件夹中,我有没有跟踪的文件。
假设我有档案
a/file1
a/untracked1
b/file2
b/untracked2
我只想将跟踪的文件移动到子文件夹subdir,所以目标是:
subdir/a/file1
subdir/a/untracked1
subdir/b/file2
subdir/b/untracked2
我所做的是:
mkdir tmpdir && mv a b tmpdirgit checkout a b mkdir subdir && mv a b subdirgit add --update目录更改技巧):(git add subdir通常这甚至会添加未跟踪的文件-这将需要创建.gitignore文件)git status 现在仅显示移动的文件mv tmpdir/* subdirgit status看起来我们执行了git mv:)