我创建了一个包含大量源文件和文件夹的文件夹。

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

我试过这些:

Git添加包含 Git mv common/ include/ 但是它会因为这个错误而失败 致命:坏源,源=myrepo/common,目的地=myrepo/include 我尝试了git mv common/ include/common,但我得到了相同的错误

你知道怎么做到吗?


当前回答

您可以使用这个脚本。

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

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

其他回答

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

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

我在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的文件(在公共文件夹中) newdir = " . .美元/ include / $(目录名)”;mkdir -p $newdir;:在include文件夹中创建一个新文件夹,目录结构与普通目录相同 git mv $f $newdir/$(basename "$f"):将文件移动到新创建的文件夹中

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

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

在移动文件之后,您可能想要清理存储库以删除任何剩余的未分阶段更改-只要记住先运行!

git clean -fd -n

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

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

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

记得要承诺!

移动文件并使用git stage

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

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

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

使用Git Tortoise非常简单。

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

将显示一个菜单,其中有Git移动版本的项目和Git移动和重命名版本的项目。

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