簡體   English   中英

如何跟蹤遠程存儲庫中的文件子集?

[英]How can I track a subset of files from a remote repository?

我正在嘗試解決以下情況:我想將一個(不屬於公共的)項目包含在我的項目中,通過刪除冗余和/或不需要的文件來稍微調整原始文件樹的大小,並且只保留最低限度,但也保留了跟蹤對原始文件的修改的可能性。

我已經嘗試制作我自己的所述存儲庫副本,將原始存儲庫添加為遠程,但這只會在我開始從我自己的副本中刪除文件之前起作用,此時嘗試獲取遠程更改失敗,因為我丟失了文件。

那是正常的嗎? 我在這個過程中搞砸了嗎,有沒有更優雅的方法來完成這個?

簡短的回答是你不能這樣做:Git 基於提交,而不是文件,並且每個提交都包含每個文件的完整快照 這意味着如果您進行新提交,其中某些文件不存在,則舊提交和新提交之間的區別在於該文件已被刪除。 任何嘗試使用來自其他存儲庫的稍后提交——這需要某種合並工作,無論是來自 rebase 的 cherry-pick、手動 cherry-pick 還是git merge操作:所有這些都執行合並-as-a-verb action——將您刪除文件視為:刪除文件。

這最終不是致命的(因為您可以根據需要以任何方式解決修改/刪除沖突),但總的來說這是一個糟糕的計划。

在任何情況下,一個存儲庫都不允許包含另一個存儲庫,所以如果你有自己的存儲庫並且你想克隆和使用其他存儲庫作為子集,你要么面臨:

  • 將他們的所有文件直接合並到您自己的存儲庫中,之后您的提交和他們的提交無關,因此 Git 幫不上什么忙; 或者
  • 將您所有的文件合並到他們的存儲庫中,這可能與您想要的方式“顛倒”; 或者
  • 使用子模塊,它們有自己的問題。

一般來說,子模塊——雖然很痛苦(人們稱它們為sob模塊是有原因的)——往往是這里最受歡迎的方法。 例如,許多 Google 軟件都以這種方式使用子模塊。

警告:下面的答案只適用於非常有限的情況,即刪除的文件在上游存儲庫中永遠不會被修改

由於遠程存儲庫副本中缺少文件,只要遠程上存在任何后續提交, git pull就會失敗並出現“分歧分支”錯誤。 但是,在您的情況下, git rebase應該完全符合您的要求。

簡單來說,rebase 只會將您的提交重新應用到原始存儲庫(通常是origin/main )的選定提交上。 您最終會得到當前origin/main目錄減去您選擇刪除的文件的副本。 查看 git-rebase文檔了解詳細信息。

這是一個例子:

# Clone a repository and remove some files from my local copy
git clone https://github.com/some_repo
cd some_repo
git rm file_a file_b
git commit -m "remove unneeded files"
git rm file_c
git commit -m "remove file_c"

# At a later time, bring in new commits from the
# remote repository and rebase my commits (removals)
# atop the updated content
git fetch
git rebase origin/main

暫無
暫無

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

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