2010-10-27 39 views
0

我用git-P4進口大量回購,並發現我有一些奇怪的混合大小寫的文件名,如:git-p4克隆的repo包含混合文件名的情況 - 如何解決?

dirA/DIRb/file1.txt 

,然後其他的文件,像這樣:

DIRa/dirB/FILE2.txt 

等。這些進入回購這種方式,因爲git-p4使用快速導入。這會導致Git神祕地宣稱有未跟蹤的目錄,這些目錄肯定不是未跟蹤的,並且沒有新文件。我從閱讀這個問題的發現:

git still untracked after add

特別slayerIQ的回答,這可以通過重命名迪爾斯問題有匹配的情況下,可以固定。事實上,在少數情況下,文件只有一種格式,這固定了它。但對於像我上面提到的那些混合起來的東西,它什麼都不做。這類上市印證了我關於本案的懷疑:

git ls-tree --name-only -r branch 

我一直在使用歷史重寫嘗試修復它認爲,但似乎非常重量級的,我有點猶豫去那裏,除非我有(樹是〜25K文件)。另一方面,我在一棵乾淨的樹上做了「git status」,並獲得了大約35個「未跟蹤」路徑的列表。所以這是站不住腳的。

如果需要,我可以從頭開始做一個git-p4克隆,但我懷疑混合大小寫路徑來自Perforce本身。 SmartGit在樹上沒有這個問題,並且將確切的樹複製到一個新的回購工作正常(因爲它被正確添加)。

關於如何進行的任何想法?

謝謝:)

+0

我相信這是git-p4中的一個錯誤,我試着在此修復它: https://github.com/larsxschneider/ git/commit/75d75def99ad4d260cb45d402e0e7a2dde4b8e28我向git郵件列表提出了修正,當修復程序被接受時我會更新這個答案。 – 2015-08-03 07:47:07

回答

0

我繼續嘗試git filter-branch --tree-filter "" HEAD但沒有做任何事情。也許有一種更漂亮的方式來做到這一點,我錯過了。 (我的git-FU較弱。)

這是醜陋的,醜陋的,醜陋的,但我發現至少有一個辦法做到這一點:

  • git-p4 rebase得到的一切是最新的。

  • .git複製到另一個目錄。

  • 切換到該新目錄並使用git reset --hard更新樹。

  • 刪除剛剛複製的那張閃亮的.git。現在有一個最新的Perforce登機牌的原始樹。

  • git initgit add -A,然後git commit,以對新樹進行初始簽入。對於提交信息,模仿的git-P4的初始登記入住信息:

Initial import of //depot/ from the state at revision #head

[git-p4: depot-paths = "//depot/": change = 58840]

  • 當然更新58840到前面什麼是你最後修訂,你的倉庫路徑是適當的。 (查看另一棵樹中的提交日誌會告訴你一切你需要知道的。)

  • git gc之後,如果你不想讓事情變得非常緩慢。

您現在應該有一個基本的非git-p4樹。我們還需要設置遠程參考。我確信有這樣一個聰明的Git方式,但我不知道,所以我會告訴你我做了什麼。

  • git log找到我們的進口版本。記下它的SHA ID。

  • 看你的原始回購的.git/refs樹。將.git/refs/remotes複製到<newrepo>/.git/refs。編輯refs/remotes/p4/master以反映您的HEAD的SHA ID。

你現在應該有一個功能齊全的回購看起來像git-p4一樣檢查出來,但一致的套管。當然,你失去了你以前的本地歷史:(但如果你這樣做很早,這是沒有什麼大不了的。

我不確定問題是否會隨着時間的推移回來,如果git-p4繼續使用快速導入,但我的樹現在在git status上顯示爲乾淨時