Git命令将一个文件夹移动到另一个文件夹

我创建了一个文件夹common,里面有很多源文件和文件夹。

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

我试过这些:

  1. < p > git add include

  2. < p > git mv common/ include/

    但是它会因为这个错误而失败

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

  3. 我尝试了git mv common/ include/common,但我得到相同的错误

你知道怎么做到吗?

234633 次浏览
 git mv common include

应该工作。

git mv手册页:

git mv [-f] [-n] [-k] <source> ... <destination directory>

在第二种形式中,最后一个参数必须是一个现有目录;给定的源代码将被移动到这个目录中
索引在成功完成后被更新,但更改仍然必须提交

没有“git add"应该做之前的举动。


注意:“&;__abc0 &;”,当B不作为目录存在时,应该出错,但它没有。

关于Git 1.9/2.0(2014年Q1),请参见提交c57f628 by 马蒂厄·梅(moy):

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最好的一点是您不需要显式地跟踪文件重命名。Git将通过比较文件的内容来找出它。

所以,在你的情况下,不要这么努力:参考:Git mv docs

$ mkdir include
$ git 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
#

我有类似的问题,但在文件夹,我想移动我有文件,我没有跟踪。

假设我有文件

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 tmpdir
  • 检查旧文件git checkout a b
  • 创建新目录并将干净的文件夹(没有未跟踪的文件)移动到新子目录:mkdir subdir && mv a b subdir
  • 添加所有来自subdir的文件(因此Git只能添加以前跟踪的文件-它是某种git add --update,目录更改技巧): git add subdir(通常这甚至会添加未跟踪的文件-这将需要创建.gitignore文件)
  • git status现在只显示移动的文件
  • 将其余文件从tmpdir移动到subdir: mv tmpdir/* subdir
  • git status看起来像我们执行了git mv:)

很抱歉,我没有足够的声誉来评论“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,但没有历史(

只是想警告,小心使用“Andres Jaan Tack”的建议,如果你不想失去你的git历史。

命令:

$ git mv oldFolderName newFolderName

它通常工作得很好。

错误"bad source…"通常表示在上次提交后,源目录中有一些重命名,因此git mv无法找到预期的文件。

解决方法很简单——在应用git mv之前提交即可。

另一种方法是将目录中的所有文件移动到子目录(保持git历史):

$ for file in $(ls | grep -v 'subDir'); do git mv $file subDir; done;

确保在运行之前已将所有更改添加到暂存区域

git mv oldFolderName newFoldername

Git错误失败

fatal: bad source, source=oldFolderName/somepath/somefile.foo, destination=newFolderName/somepath/somefile.foo

是否有任何未添加的文件,所以我才知道。

我在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:找到所有签入git的文件(在common文件夹中)
  • newdir="../include/$(dirname $f)"; mkdir -p $newdir;:在include文件夹中创建一个新文件夹,其目录结构与common相同
  • git mv $f $newdir/$(basename "$f"):将文件移动到新创建的文件夹中

这样做的原因是git在将文件移动到现有文件夹时似乎有问题,如果你试图将文件移动到不存在的文件夹(因此是mkdir -p),它也会失败。

这种方法的好处是它只有会触及已经签入git的文件。通过简单地使用git mv来移动整个文件夹,并且该文件夹包含未分阶段的更改,git将不知道该做什么。

在移动文件后,你可能想要清理存储库来删除任何剩余的未分阶段的更改-只要记住先演练!

git clean -fd -n

我通过这样做解决了这个问题:

  • 电源外壳控制台
  • 运行dir
  • Alt-click并拖动文件/文件夹名称列,然后复制
  • 粘贴到notepad++
  • 运行replace with regex:用git mv ".\\\1" ".\\<New_Folder_Here>\"替换(.*)
  • 从notepad++复制所有文本到powershell
  • 回车

另一个重要的注意,我错过了,并修复了“坏来源”;错误立即:

我只是想分享我的错误,以防有人遇到。:))

当你运行命令时,确保在git控制台中选择了正确的路径:

- git mv Source Destination

如有需要,请使用:

- cd SourceFolder

然后是mv命令。

你可以使用这个脚本

# git mv a folder and sub folders in windows


function Move-GitFolder {
param (
$target,
$destination
)
    

Get-ChildItem $target -recurse |
Where-Object { ! $_.PSIsContainer } |
ForEach-Object {
$fullTargetFolder = [System.IO.Path]::GetFullPath((Join-Path (Get-Location) $target))
$fullDestinationFolder = [System.IO.Path]::GetFullPath((Join-Path (Get-Location) $destination))
$fileDestination = $_.Directory.FullName.Replace($fullTargetFolder.TrimEnd('\'), $fullDestinationFolder.TrimEnd('\'))


New-Item -ItemType Directory -Force -Path $fileDestination | Out-Null


$filePath = Join-Path $fileDestination $_.Name


git mv $_.FullName $filePath
        

}
}

使用

Move-GitFolder <Target folder> <Destination folder>

与其他解决方案相比,此解决方案的优势在于它递归地移动文件夹和文件,甚至在文件夹结构不存在时创建文件夹结构。

移动文件并使用git stage

可以使用你最喜欢的工具(命令行,图形文件资源管理器)移动你的文件,git会发现你做了移动而不是删除和创建一旦你开始行动,正如@Andres所建议的那样,但如果你做了太多的修改,如Erik Kaplun所指出的,显式的git mv可能会有所帮助。

在某些应用程序中不使用Stage

一些GUI git工具(如GitHub Desktop)不提供对stage的直接访问:您可以选择和取消选择修改,但它不会修改底层git stage。你需要使用更强大的git工具,如命令行工具或正宗的git GUI来进行更改,然后GitHub Desktop也将显示操作为重命名。

如果你使用GitLab,它的集成Web-IDE,可以用于一些文件管理任务,包括移动和重命名(不需要本地克隆)。

单击存储库主窗口上的Web-IDE。

enter image description here

右键单击文件夹并选择Rename/Move(例如将src移动到foo/bar/src)。这些变化将显示在web ide中。

记得要承诺!

enter image description here

使用Git Tortoise非常简单。

右拖动源到目标(选择源,按住鼠标右键,拖动到目标,释放鼠标)。

将显示一个包含Git Move versioned itemsGit Move and rename versioned items的菜单。

当然,git回购应该在本地克隆

Git move with Git tortoise

我用这个命令解决了这个问题 mv & lt; parent_folder / folder_to_move>& lt; new_folder>而在<new_folder>的工作目录。 这个命令的作用是重命名<folder_to_move>进入<new_folder>的名字。之后,您可以重命名目标文件夹(folder_to_move)使用mv <new_folder>(以前<folder_to_move>) <new_name_of_folder>

mv & lt; new_folder>& lt; new_name_of_folder>