我创建了一个包含大量源文件和文件夹的文件夹。
现在我想将common文件夹移动到include文件夹中,这样它看起来就像include/common
我试过这些:
Git添加包含 Git mv common/ include/ 但是它会因为这个错误而失败 致命:坏源,源=myrepo/common,目的地=myrepo/include 我尝试了git mv common/ include/common,但我得到了相同的错误
你知道怎么做到吗?
我创建了一个包含大量源文件和文件夹的文件夹。
现在我想将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>
与其他解决方案相比,此解决方案的优势在于它递归地移动文件夹和文件,甚至在文件夹结构不存在时创建文件夹结构。
其他回答
使用Git Tortoise非常简单。
右拖动源到目标(选择源,按住鼠标右键,拖动到目标,释放鼠标)。
将显示一个菜单,其中有Git移动版本的项目和Git移动和重命名版本的项目。
当然,git回购应该在本地克隆
我在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
git mv common include
应该工作。
从git mv手册页:
git mv [-f] [-n] [-k] <source> ... <destination directory>
在第二种形式中,最后一个参数必须是一个已存在的目录;给定的源代码将被移动到这个目录中。 索引在成功完成后更新,但仍然必须提交更改。
在移动之前不应该做“git添加”。
注意:“git mv A B/”,当B作为一个目录不存在时,应该出错,但是它没有。
参见Matthieu Moy (Moy)针对Git 1.9/2.0(2014年第一季度)编写的commit c57f628:
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 mv Source Destination
如有需要,请使用:
- cd SourceFolder
然后是mv命令。
我使用这个命令解决了这个问题 Mv <parent_folder/folder_to_move> <new_folder>而在<new_folder>的工作目录。 这个命令的作用是将<folder_to_move>重命名为<new_folder>名称。之后,您可以重命名目标文件夹(folder_to_move)使用mv <new_folder>(以前<folder_to_move>) <new_name_of_folder>
Mv <new_folder> <new_name_of_folder>