git命令将文件夹移到另一个文件夹中

时间:2010-10-10 15:01:31

标签: git

我创建了一个包含大量源文件和文件夹的文件夹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但我得到了同样的错误

  4. 知道如何实现这个目标吗?

14 个答案:

答案 0 :(得分:163)

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
#

答案 1 :(得分:138)

 git mv common include

应该有用。

来自git mv man page

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

在第二种形式中,最后一个参数必须是现有目录; 指定的来源将移至此目录   成功完成后会更新索引,但仍必须提交更改。

在移动之前,不应该完成“git add”。


注意:“git mv A B/”,当B不存在作为目录时,应该出错,但事实并非如此。

commit c57f628 Matthieu Moy (moy) {2014年第1季} Git 1.9/2.0见{{3}}:

  

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

答案 2 :(得分:17)

命令:

$ git mv oldFolderName newFolderName

通常可以正常使用。

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

解决方案很简单 - 只需在应用git mv之前提交。

答案 3 :(得分:11)

确保在运行

之前已将所有更改添加到暂存区域
git mv oldFolderName newFoldername

git失败并显示错误

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

如果有任何未添加的文件,我只是发现了。

答案 4 :(得分:3)

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

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

答案 5 :(得分:3)

我在git mv遇到了类似的问题,我想将一个文件夹的内容移动到现有文件夹中,最后得到这个&#34;简单&#34;脚本:

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将不知道该怎么做。

移动文件后,您可能需要clean the repository删除任何剩余的非暂停更改 - 只需记住先干运行!

git clean -fd -n

答案 6 :(得分:2)

对不起,我没有足够的声誉评论&#34;答案&#34; &#34; Andres Jaan Tack&#34;。

我认为我的信息会被删除(( 但我只是想警告&#34; lurscher&#34;和其他有同样错误的人:小心做

$ 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中,但没有历史记录(

只是想警告,小心使用&#34; Andres Jaan Tack&#34;的建议,如果你不想失去你的git hsitory。

答案 7 :(得分:1)

移动文件并使用 git stage

可以使用您喜欢的工具(命令行、图形文件资源管理器)移动您的文件,一旦您暂存操作,git 就会发现您是移动而不是删除和创建 /strong>,正如 @Andres 所建议的那样,但如果您进行太多修改,正如 Erik Kaplun 指出的那样,显式 12.800.000.000 可能会有所帮助。

在某些应用程序中不使用舞台

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

答案 8 :(得分:0)

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

假设我有文件

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:)

答案 9 :(得分:0)

我错过的另一个重要说明,并立即修复了“错误来源”错误:

(只是以为我会分享我的错误,以防万一有人遇到它。:))

运行命令时,请确保在git Console中选择了正确的路径:

- git mv Source Destination

如果需要,请使用:

- cd SourceFolder

然后是mv命令。

答案 10 :(得分:0)

您可以使用此 script

# 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>

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

答案 11 :(得分:0)

如果您使用的是 GitLab,其集成的 Web-IDE 可用于某些文件管理任务,包括移动和重命名(无需本地克隆)

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

enter image description here

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

记得提交!

enter image description here

答案 12 :(得分:0)

使用 Git Tortoise 很容易。

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

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

当然应该在本地克隆git repo

Git move with git tortoise

答案 13 :(得分:-1)

我通过以下方法在Windows上解决了这个问题:

  • 打开Power Shell控制台
  • 运行目录
  • 按住Alt键并在“文件/文件夹名称”列上拖动,然后复制
  • 粘贴到记事本++
  • 使用正则表达式运行替换:将(.*)替换为git mv ".\\\1" ".\\<New_Folder_Here>\"
  • 将所有文本从notepad ++复制到powershell
  • 按Enter