git命令来移动另一个文件夹
我已经创build了一大堆源文件和文件夹的common
文件夹。
现在我想将common
文件夹移动到include
文件夹中,使其看起来像include/common
我试过这些:
-
git add include
-
git mv common/ include/
但是这个错误会失败
致命的:坏源,源= myrepo / common,destination = myrepo / include
-
我试过git mv common / include / common,但是我得到了同样的错误
任何想法如何实现这一目标?
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 common include
应该pipe用。
从git mv
手册页 :
git mv [-f] [-n] [-k] <source> ... <destination directory>
在第二种forms中,最后一个参数必须是现有目录; 给定的源将被移动到这个目录中 。
成功完成后更新索引,但仍必须提交更改。
移动之前不应该做“ git add
”。
注意:“ git mv AB/
”,当B
不存在作为一个目录时,应该出错,但它没有。
参见Matthieu Moy( moy
)为Git 1.9 / 2.0 (2014年第1季度) 提交的c57f628 :
Git用来修剪尾部的斜杠,并使命令等效于'
git mv file no-such-dir
',它创build了no-such-dir
文件(而后面的斜杠明确指出它只能是一个目录)。此修补程序跳过目标path的尾部斜杠删除。
具有结尾斜杠的path被传递给重命名(2),这些错误与适当的消息一起:
$ git mv file no-such-dir/ fatal: renaming 'file' failed: Not a directory
命令:
$ git mv oldFolderName newFolderName
它通常工作正常。
错误“不良来源…”通常表示在上次提交后,在源目录中有一些重命名,因此git mv
找不到预期的文件。
解决方法很简单 – 只是在应用git mv
之前提交。
确保在运行之前将所有更改添加到临时区域
git mv oldFolderName newFoldername
git失败,错误
fatal: bad source, source=oldFolderName/somepath/somefile.foo, destination=newFolderName/somepath/somefile.foo
如果有任何未添加的文件,所以我只是发现了。
将目录中的所有文件移动到子目录(保持git历史logging)的另一种方法:
$ for file in $(ls | grep -v 'subDir'); do git mv $file subDir; done;
我有一个与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
:find所有的文件(在common
文件夹中)签入git -
newdir="../include/$(dirname $f)"; mkdir -p $newdir;
:在include
文件夹内创build一个新文件夹,其目录结构与common
目录结构common
-
git mv $f $newdir/$(basename "$f")
:将文件移动到新创build的文件夹中
这样做的原因是,git似乎有问题移动文件到现有的文件夹,并且如果您尝试将文件移动到不存在的文件夹(因此mkdir -p
)也会失败。
这种方法的好处是, 它只接触已经签入到git的文件。 通过简单地使用git mv
移动整个文件夹,并且该文件夹包含未分离的更改,git将不知道该怎么做。
在移动文件之后,您可能需要清理存储库以删除任何尚未分配的更改 – 请记住首先干运行!
git clean -fd -n
对不起,我没有足够的声望来评论“安德烈·贾恩·塔克”的“答案”。
我想我的信使会被删除((但是我只是想警告“lurscher”和其他人有同样的错误:要小心
$ mkdir include $ mv common include $ git rm -r common $ git add include/common
这可能会导致您不会在新文件夹中看到项目的git历史logging。
我尝试了
$ 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历史。 至less我的项目不会丢失。 现在我有我的项目newFolderName,但没有历史(
只是要警告,如果你不想失去你的git hsitory,请小心使用“Andres Jaan Tack”的build议。
我有类似的问题,但在我想要移动的文件夹中,我有我没有跟踪的文件。
假设我有文件
a/file1 a/untracked1 b/file2 b/untracked2
我只想把跟踪文件移动到子文件subdir
,所以目标是:
subdir/a/file1 subdir/a/untracked1 subdir/b/file2 subdir/b/untracked2
我所做的是:
- 我创build了新文件夹,并移动了我感兴趣的所有文件:
mkdir tmpdir && mv ab tmpdir
- 签出旧文件
git checkout ab
- 创build新的目录,并将干净的文件夹(没有未跟踪的文件)移动到新的子目录:
mkdir subdir && mv ab subdir
- 添加所有文件从子目录(所以Git可以添加只跟踪以前的文件 – 这是一些
git add --update
– 更新与目录更改技巧 ):git add subdir
(通常这会添加甚至未跟踪的文件 – 这将需要创build.gitignore
文件) -
git status
现在只显示移动的文件 - 将其余的文件从tmpdir移到subdir:
mv tmpdir/* subdir
-
git status
看起来像我们执行git mv
🙂