簡體   English   中英

我可以僅從另一個git存儲庫中提取某些文件嗎?

[英]Can I pull only certain files from another git repository?

例如,假設我有存儲庫1和存儲庫2。存儲庫1有一個文件/a/b/c/d 我可以將此文件作為/e/f/g/h導入到存儲庫2中嗎?

原因是我想從其他git存儲庫的實驗分支中提取更改。 我嘗試將所有內容合並在一起,但是有很多(各種)沖突。 因此,我懷疑是否可以合並整個分支,但我想嘗試盡可能多地引入。

有什么方法可以做我想做的事,還是我不得不直接復制文件?

您必須直接復制文件。 Git處理整個存儲庫,而不是其中的單個文件。

我想您可以將存儲庫2設置為遠程存儲庫,獲取( 而不是拉出)其分支,然后使用git checkout從該分支中​​獲取文件,但是該解決方案可能很麻煩。

您可以使用git archive從遠程存儲庫獲取文件。 然后,您可以將文件添加並提交到存儲庫。 這種方法不會保留其分支機構的歷史記錄。 有關詳細信息,請參見git archive docs

如果您想嘗試保留該實驗分支的某些部分,則可以git fetch其存儲庫,然后git rebase其實驗分支重新建立到您的存儲庫中,並根據需要編輯或跳過具有沖突的提交。 一旦您的存儲庫中有一個清理分支,就可以將其合並。請參見git rebase docs

沒有簡單的解決方法,但是Ayushya Jaiswal 在這里有一個寫得很好的指南(將文件從一個存儲庫移動到另一個存儲庫,保留git歷史記錄) ,我將在這篇文章中引用它作為存檔。

tl; dr :實際上,您是在(安全地)重新構建存儲庫並僅提取所需的文件。 然后將git歷史記錄從您的基礎存儲庫中提取到您當前正在使用的任何存儲庫中。

開始之前的注意事項
如果您要特定的文件,則也需要https://stackoverflow.com/a/56334887/929999 我將在引用的指南中的以下步驟中添加免責聲明。

這是文章中引用的文字:


准備好文件以從存儲庫A中移動。

第1步 :制作存儲庫A的副本,因為以下步驟對此副本進行了重大更改,您不應該推送!

mkdir cloneA
cd cloneA
git clone --branch <branch> --origin origin --progress \
  -v <git repository A url>
# eg. git clone --branch master --origin origin --progress \
#   -v https://github.com/username/myproject.git
# (assuming myprojects is the repository you want to copy from)

第2步 :轉到該目錄。

cd <git repository A directory>
#  eg. cd myproject
# Folder Path is ~/cloneA/myproject

步驟3 :為避免意外進行任何遠程更改(例如,通過推送),請刪除指向原始存儲庫的鏈接。

git remote rm origin

這是修改的步驟 ,而是通過從此處執行git filter-branch --prune-empty ... $FILES步驟來進行修改 ,它將僅推斷出您所需的文件。 其余應相同。

在您的情況下,將是這樣的:

FILES='/a/b/c/d'
git filter-branch --prune-empty --index-filter "
                        git read-tree --empty
                        git reset \$GIT_COMMIT -- $FILES
                " \
        -- --all -- $FILES

步驟4 :瀏覽您的歷史記錄和文件,刪除 FOLDER_TO_KEEP沒有的 FOLDER_TO_KEEP 結果是將 FOLDER_TO_KEEP的內容噴出到存儲庫A的庫中。

 
 
 
 
  
  
  git filter-branch --subdirectory-filter <directory> -- --all # eg. git filter-branch --subdirectory-filter subfolder1/subfolder2/FOLDER_TO_KEEP -- --all
 
 
  

第5步 :清除不需要的數據。

git reset --hard
git gc --aggressive 
git prune
git clean -fd

步驟6 :將所有文件和目錄移動到要推送到存儲庫B的NEW_FOLDER。

mkdir <base directory>
#eg mkdir NEW_FOLDER
mv * <base directory>
#eg mv * NEW_FOLDER

或者,您可以使用GUI將所有文件和目錄拖到NEW_FOLDER。

步驟7 :添加更改並提交。

git add .
git commit

將文件合並到新的存儲庫B中。

第1步:如果還沒有存儲庫B,請制作一個副本。

mkdir cloneB
cd cloneB
git clone <git repository B url>
# eg. git clone 
https://github.com/username/newproject.git

第2步 :轉到該目錄。

cd <git repository B directory>
#  eg. cd newproject
# Folder Path is ~/cloneB/newproject

步驟3 :創建到存儲庫A的遠程連接,作為存儲庫B中的分支。

git remote add repo-A <git repository A directory>
# (repo-A can be anything - it's just a random name)

# eg. git remote add repo-A ~/cloneA/myproject

步驟4 :將文件和歷史記錄從此分支(僅包含要移動的目錄)拉到存儲庫B中。

git pull repo-A master --allow-unrelated-histories
# This merges master from repository A into repository B

步驟5 :刪除與存儲庫A的遠程連接。

git remote rm repo-A

步驟6 :最后,推送更改

git push

您可以刪除兩個克隆的存儲庫。
文件隨歷史記錄的更改現在可在存儲庫B中在線獲得。

暫無
暫無

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

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