我创建了一个包含大量源文件和文件夹的文件夹common
。
现在我想将common
文件夹移到include
文件夹中,使其看起来像include/common
我试过这些:
git add include
git mv common/ include/
但失败并显示此错误
致命:糟糕的来源,来源= myrepo / common,destination = myrepo / include
我试过git mv common / include / common但我得到了同样的错误
知道如何实现这个目标吗?
答案 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 [-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 就会发现您是移动而不是删除和创建 /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
git add --update
的一些目录更改技巧):git add subdir
(通常这会添加甚至未跟踪的文件 - 这需要创建.gitignore
文件)git status
现在只显示已移动的文件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。
右键单击文件夹并选择 Rename/Move
(例如将 src
移动到 foo/bar/src
)。更改将显示在 web-ide 中。
记得提交!
答案 12 :(得分:0)
使用 Git Tortoise
很容易。
右键拖动源到目标(选择源,按住鼠标右键,拖动到目标,释放鼠标)。
将显示一个包含 Git Move versioned items
和 Git Move and rename versioned items
的菜单。
当然应该在本地克隆git repo
答案 13 :(得分:-1)
我通过以下方法在Windows上解决了这个问题:
(.*)
替换为git mv ".\\\1" ".\\<New_Folder_Here>\"