git命令来移动另一个文件夹

我已经创build了一大堆源文件和文件夹的common文件夹。

现在我想将common文件夹移动到include文件夹中,使其看起来像include/common

我试过这些:

  1. git add include

  2. git mv common/ include/

    但是这个错误会失败

    致命的:坏源,源= myrepo / common,destination = myrepo / include

  3. 我试过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 🙂