2010-10-10 153 views
133

我創建了一個文件夾common,其中包含一堆源文件和文件夾。git命令將文件夾移入另一個文件夾

現在我想的common文件夾移動到include文件夾,以便它看起來像include/common

我嘗試這些:

  1. git add include

  2. git mv common/ include/

    但它失敗與此錯誤

    fatal: bad source, source=myrepo/common, destination=myrepo/include

  3. 我試着混帳MV普通/包括/常見,但我得到了同樣的錯誤

任何想法如何實現這一目標?

回答

148

其中一個最好的東西約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 
# 
+24

這對我不起作用(使用Windows 7,1.7.6.msysgit.0)。 Git認爲舊文件已被刪除並添加了新文件。 – Bart 2011-11-09 13:18:47

+0

嗯,也許git使用一些外部實用程序來確定文件的相同性在Windows上不起作用?這是git實現的核心部分。 – 2011-11-09 15:01:00

+41

使用'git mv'命令是更好的方法。 – Oliver 2012-07-06 14:13:31

109
git mv common include 

應該工作。

git mv man page

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

In the second form, the last argument has to be an existing directory; the given sources will be moved into this directory.
The index is updated after successful completion, but the change must still be committed.

否 「git add」 應移動之前完成


注:「git mv A B/」,當B不爲目錄中,應該報錯了,但事實並非如此。

Git 1.9/2.0(2014年第一季度)查看commit c57f628Matthieu Moy (moy)

Git used to trim the trailing slash, and make the command equivalent to ' git mv file no-such-dir ', which created the file no-such-dir (while the trailing slash explicitly stated that it could only be a directory).

This patch skips the trailing slash removal for the destination path.
The path with its trailing slash is passed to rename(2), which errors out with the appropriate message:

$ git mv file no-such-dir/ 
fatal: renaming 'file' failed: Not a directory 
+1

工作完美 - 使用'git mv'看起來好像更好的方法! – 2015-03-17 17:18:36

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可以只添加先前跟蹤的文件 - 這是的somekind的git add --update與目錄更改):git add subdir(通常這會增加甚至未跟蹤文件 - 這將需要創建.gitignore文件)
  • git status節目現在只有移動的文件
  • 移動的文件的休息從TMPDIR到子目錄:mv tmpdir/* subdir
  • git status看起來我們執行git mv :)
2

我很抱歉,我沒有足夠的信譽評論的「安德烈斯家安粘性」的「答案」。

我想我messege將被刪除(( 但我只是想告誡「lurscher」和其他人誰得到了同樣的錯誤:要小心做

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

這可能會導致你不會看到的git在新的文件夾項目的歷史。

我tryed

$ 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 

,我沒有看到老蠢貨歷史在我的項目。至少我的項目不會丟失。現在,我有我的newFolderName項目,但沒有歷史(

只是想提醒,使用「安德烈斯家安粘性」建議要小心,如果你不想失去你的git hsitory

+0

確保已添加所有更改。如果沒有添加更改,Git不會說「不良來源」,所以我只是發現了。 – 2015-03-16 13:49:05

11

命令:

$ git mv oldFolderName newFolderName 

它通常工作正常。

錯誤「壞源...「通常表明最後提交後出現了在源目錄中的一些重命名,因此git mv找不到預期的文件

解決方法很簡單 - 將git mv之前剛剛提交

3

另一種方法是將所有文件。一個目錄的子目錄(保持git的歷史):

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

6

確保已將所有更改的臨時區域運行

git mv oldFolderName newFoldername 

混帳失敗,錯誤

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

,如果有任何unadded文件,所以我剛剛發現。

+0

「如果有任何未添加的文件,所以我只是發現了。」 - 謝謝! – 2017-09-22 03:08:52

3

我有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:查找所有文件(在common文件夾中)簽入git
  • newdir="../include/$(dirname $f)"; mkdir -p $newdir;:創建一個新的文件夾中的include文件夾內,使用相同的目錄結構common
  • git mv $f $newdir/$(basename "$f"):將文件移動到新創建的文件夾

之所以這樣做這是混帳似乎在將文件移動到現有文件夾時遇到問題,如果您嘗試將文件移動到不存在的文件夾(因此mkdir -p),它也會失敗。

這種方法的好處是它只有接觸已經檢入到git的文件。通過簡單地使用git mv移動整個文件夾,並且該文件夾包含未分離的更改,git不知道該怎麼做。

移動文件後,你可能想clean the repository刪除任何剩餘的未分級的變化 - 只記得晾乾運行第一!

git clean -fd -n 
相關問題