簡體   English   中英

如何在保留歷史記錄的同時拆分和重命名git中的代碼文件?

[英]How to split out and rename code files in git while preserving history?

我是 git 的新手,現在在決定清理代碼結構后面臨着 git repo 'housekeeping' 挑戰。 我的挑戰有兩個方面:

  1. 需要將標題不太理想的 REPO 和一些子文件夾和文件重命名為干凈的 Python 標准符號(從使用破折號到帶下划線的較短名稱等)。

  2. 將測試代碼拆分為保存在專用 \\tests 文件夾中的 .py 文件。

我發現在 git 中清理上述代碼和文件結構很難保留更改歷史記錄。 關於該主題的其他答案似乎涵蓋了這項工作的一部分。 我嘗試通過 git online 重命名文件,但是,雖然正式保留了歷史記錄,但它僅存儲已移至 \\test 文件夾的大塊測試代碼的批量刪除行為。 新創建的 \\tests\\basic_test.py 和 \\tests\\advanced_test.py 文件顯然被 git 視為新文件,即之前的更改歷史為零。

簡而言之,我需要將測試代碼拆分為存儲在新 \\tests 子文件夾中的新文件,然后通過重命名 repo 來重命名根代碼文件夾。 這是否可以在不使用 git 命令行的情況下完成? 如果不是,我想現在是我學習它的時候了,我很欣賞指導,以實現我在上面跳入水中所需的內容,但不會陷入 git 命令行教程的泥潭,即以最少的理論知識實現我需要的更改。

非常感謝分享智慧!

 - mt code structure 1.0 \\money-tracker # local dir and git repo name money_tracker_v01_9.4 - mt code structure 2.0 \\money_tracker # app root_dir (local dir and git repo name) \\mt # code_dir (shared code base named after main mod) mt.py \\tests test_basic.py test_advanced.py \\data_in (private, local) coa.csv trxn_data_x.csv \\data_out (private, local) cf_report_x.txt * each mt_dir may contain aux files (fe __init__.py, context.py)

最小的理論部分,你必須學會的是:Git不會文件歷史記錄。 Git 有提交,提交就是歷史。 每個提交都有每個文件的完整快照。 1

Git 可以隨時比較任何兩個現有的提交。 如果舊提交中有一個名為F的文件,而新提交中有一個名為F的文件,我們通常假設這是同一個文件 但是假設舊提交有一個名為old/path/to/name1.py的文件,而新提交有一個名為new/name/of/name2.py 2那么也許那些應該被認為是“同一個文件”,即使它們有不同的名稱。

如果某個提交重命名了某個文件,Git 可以嘗試檢測該重命名。 此重命名檢測取決於文件在內容方面是否足夠相似。 內容 100% 匹配保證 Git 可以很容易地找到重命名。 所以當你有一個重命名文件的提交時,告訴 Git告訴我在這個提交中發生了什么變化,順便說一句,在你這樣做時檢測重命名3將使 Git 將“之前”快照與“之后”進行比較一個”,它會找到所有的重命名。

為了向您展示一個假裝“文件歷史”與git log --follow -- path ,Git會簡單地查看每個提交 Git 從最后開始向后工作(它總是這樣做),比較前后快照,並啟用重命名檢測。 如果path在“after”提交中,並且 Git 發現它是從“before”提交中的某個先前路徑重命名的,則 Git 會告訴您這一點,然后開始查找路徑名。

這基本上就是你所得到的。 因此,在重命名文件或重組項目時,最好的選擇是提交重命名,作為一次提交,然后提交所需的任何其他更改。 沒有做到這一點,因為重命名探測器可以經常檢測renamed-和更改的文件重命名,但你得到一個更好的重命名檢測保證,當你有重命名單獨提交,因此每個文件100% -匹配上一個。

請注意,是否有任何特定的 GUI 開啟重命名檢測,如果是,如何,取決於該 GUI。 Git提供的所有內容都是提交。


1提交中的文件以特殊的、只讀的、僅限 Git 的、壓縮和重復數據刪除的格式存儲。 這意味着,如果您連續進行一千次提交,並且只更改README.md一次,那么您將擁有舊版本的 998 個共享副本和新版本的 2 個共享副本,或者舊版本的 400 個共享副本以及新版本的 600 個共享副本,因此無論哪種方式,它實際上只存儲庫中兩次,而不是一千次。

然而,這也意味着當您使用 Git 存儲庫時,您看到和處理的文件不在 Git 存儲庫中 您看到和使用的文件是存儲庫中提取的副本,並在此過程中變回可用文件。 這很好地解釋了為什么 Git 的行為方式如此。

2請注意,斜杠(盡管您可以在 Windows 上使用反斜杠)是每個文件名的一部分:例如,名稱是old/path/to/name1.py 這不是一個名為old的文件夾,其中包含一個名為path的文件夾等等,這只是一個名為old/path/to/name1.py

3在命令行中,使用git diff --find-renamesgit show --find-renames啟用重命名檢測器,或將diff.renames設置為true 在 Git 2.9 及更高版本中, diff.renames默認設置為true 在早期版本中,它默認設置為false

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM