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

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

我试过这些:

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

你知道怎么做到吗?


当前回答

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

$(ls | grep -v 'subDir');做git mv $file subDir;完成;

其他回答

您可以使用这个脚本。

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

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

很抱歉,我没有足够的声誉来评论“Andres Jaan Tack”的“答案”。

我想我的留言会被删除 但我只是想警告“lurscher”和其他有同样错误的人:做的时候要小心

$ mkdir include
$ mv common include
$ git rm -r common
$ git add include/common

这可能会导致你在新文件夹中看不到项目的git历史。

如何提问

$ git mv oldFolderName newFolderName

got

fatal: bad source, source=oldFolderName/somepath/__init__.py, dest
ination=ESWProj_Base/ESWProj_DebugControlsMenu/somepath/__init__.py

我所做的

git rm -r oldFolderName

and

git add newFolderName

我没有看到旧的git历史在我的项目。至少我的项目没有丢失。现在我有我的项目在newFolderName,但没有历史(

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

使用Git Tortoise非常简单。

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

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

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

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

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

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

记得要承诺!

git最好的一点是您不需要显式地跟踪文件重命名。Git将通过比较文件的内容来找出它。

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

$ mkdir include
$ git mv common include
$ git rm -r common
$ git add include/common

运行git状态应该显示如下内容:

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   renamed:    common/file.txt -> include/common/file.txt
#