簡體   English   中英

如何在git中擁有當前文件而不是文件歷史記錄?

[英]How to have current file in git but not history of file?

我正在開發一個項目,並且正在使用git和GitHub作為我的存儲庫(實際上是一本書,但是問題也與代碼有關)。 通常,就像在軟件項目中一樣,我只保留源,並且每次從該源構建輸出(書籍PDF)時,我都會保留源。 但是,由於我正在與某人合作,將不會生成輸出,因此僅查看當前進度,因此我需要定期檢查生成的PDF,但是它很大。

我實際上不需要PDF的歷史記錄(輸出),我只需要git中的最新版本。 有什么辦法嗎? 換句話說,我不想跟蹤歷史記錄,只是讓任何分支的尖端都具有實際文件即可。

在研究這個問題時,我認為唯一的方法是定期從git中清除文件的歷史記錄,然后檢入新的PDF。 有更容易的方法嗎?

您在這里處於核心指揮區域。 您不需要歷史記錄,而只需要內容,因此請使用其內容跟蹤器核心。 唯一的問題是,您希望Git為您做多少?

最簡單的過程是簡單地標記blob:

$ make book.pdf
$ git tag -f current-book `git hash-object -w book.pdf`

這樣就完成了。 幾乎沒有任何源代碼控制命令知道如何處理該標簽,它甚至不是樹,而是一個斑點,但是Git的核心命令可以正常工作。

$ git fetch origin current-book
$ git show FETCH_HEAD >book.pdf
$ open book.pdf

我根本不會將其包括在存儲庫中。 相反,我將其視為構建工件。 您甚至可以在每次推送到GitHub時使用持續集成工具生成它。

例如,使用Travis CI,您可以構建PDF並在標記新版本時將其作為GitHub版本上傳 您還可以配置CI作業以在將代碼推送(或合並)到特定分支時運行。

其他主要的持續集成工具也可以執行這種操作,因此,我鼓勵您貨比三家,找到最適合您需求的工具。

沒有做到這一點的方法。 不要這樣 其他事情-看看克里斯的回答

如果您仍然堅持這樣做

有幾種不好的方法可以做到這一點。 可能最簡單的方法是創建一個其中沒有文件的孤立分支,將PDF作為該分支中的單個文件提交(這樣,簽出該分支就可以得到只有一個PDF文件的工作樹,然后必須復制到其他地方 ,然后git checkout您真正想要的分支,這將立即從您的工作樹中刪除 PDF文件):

$ git status

確保您沒有要提交的內容並且工作樹干凈,因為您將要臨時銷毀它們。 然后:

$ cp built.pdf /tmp/built.pdf          # save the PDF somewhere
$ git checkout --orphan pdfbranch      # create branch for one commit holding PDF
$ git read-tree --empty -u             # clear index and work-tree
$ cp /tmp/built.pdf built.pdf          # restore PDF to work-tree
$ git add built.pdf                    # copy to otherwise-empty index
$ git commit -m 'create built pdf'     # make one commit on branch
$ git checkout master                  # or whatever - PDF file goes away again

現在,您可以在將來的任何時候刪除分支pdfbranch (從該Git存儲庫的所有克隆中刪除 ),以便不再保留舊的已構建PDF文件,然后創建一個新的pdfbranch來再次保存一個已構建的文件。

(您可以使用git worktree add簡化上述操作,如果您的Git至少為2.5:請使用git worktree add --detach ../pdf-worktree master創建一個執行git checkout --orphangit read-tree --empty -u步驟,之后您可以保留添加的工作樹作為進行下一次更新的位置。但是總的來說,這都是個壞主意。

您可以使用標簽代替分支名稱; 效果是一樣的。 但是,標簽名稱不會移動,因此此方法比較棘手。

這里的總的想法以及這個想法不好的原因是歷史就是提交。 提交存儲庫的歷史記錄。 要擁有沒有其他歷史記錄的文件,該文件必須完全在一次提交中。

另一種方法是git add pdf作為單獨的blob對象進行git add ,然后將標記 (輕量或帶注釋)附加到blob對象。 刪除標簽以釋放對象(它將最終被刪除)。 這具有與以前相同的缺點,加上標簽無法移動的問題,以及要提取文件的事實,您需要有點Git專家的知識。

暫無
暫無

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

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