2014-10-01 90 views
0

我們需要將Git Repository從一個網絡導入到另一個網絡。對於安全性提升,它必須作爲文本文件傳遞,它表示內部文件的可讀版本(存儲庫中的所有Blob,或者至少包含兩個Blob之間的所有差異)。從.git目錄創建tar並不好(安全掃描不可讀),也不是git bundle格式。Git - 從補丁文件重建/克隆

這個應用程序是補丁文件(安全掃描知道要在補丁的base64中處理二進制文件)。它適用於線性回購,但我們也需要合併提交。我們想過腳本會在源做:git log -p -m --parents --first-parent > file,並在DEST將解析該文件,並會:

  • 應用它承諾通過git am
  • 承諾在父母一方的每個分支(第二個孩子)將創建分支(名稱branch<hash-of-first-commit>
  • 每個合併會做:git merge <branch-name> --no-commit -s ours,比第一父的diff git apply,比git commit ...

是後W只需要將分支重命名爲實名,然後完成。我沒有看到缺陷,但尚未實施。

問題:

  • 是否有存在的,爲此,工作液(腳本工具)?
  • 如果沒有 - 療法是我描述,這將使它不準確反映它們之間的正確連接的提交過程中的任何缺陷(我們必須保持原有的提交哈希)?

回答

0

這是我聽到的最瘋狂的一段時間。

以下是完全未經測試的。使用風險自負。

看到這裏的鏈接,現在我只想用git rev-list --objects HEAD作爲替身你會真正需要做的就是所有對象

Getting all objects in a database

總結各地得到一個簡單的腳本您的對象,找出它是什麼類型的對象,然後以文本格式存儲對象類型,SHA和內容。您可以創建4個目錄(blob,commit,tree,tag),然後在每個sha的名稱中存儲一個文件,並使內容成爲sha的文本。

#/bin/sh 
for sha in $(git rev-list --objects HEAD | awk '{print $1}') 
do 
    objType=$(git cat-file -t ${sha}) 
    git cat-file -p ${sha} > <path>/${objType}/${sha} 
done 

理論上,無論如何,這將創建您的對象的所有文本表示形式。轉移他們,然後扭轉過程。

爲BLOB文件你可以使用

cat <path>/blob/${sha} | git hash-object -w 

的樹,你會使用

cat <path>/tree/${sha} | git mktree 

的承諾 - 我不知道低水平命令來在git cat-file -p輸出直接讀取。格式是常規的,所以不應該很難。從以下

tree ca1fdb46ebf7f2c5dece94f21cec3385e22fb6dd 
parent d685ab16fe1ecf67b77b36bda711d8189f3a54a3 
author Andrew <[email protected]> 1411616364 -0700 
committer Andrew <[email protected]> 1411616364 -0700 

commit message 

提取然後做

GIT_AUTHOR_NAME= Andrew [email protected] (etc. for dates and commtiter info) git commit-tree $(TREE_SHA) -p $(PARENT SHA) [ more parents if needed ] -m "MESSAGE" 

解析這一切,傳遞給git commit-tree除非你有更好的東西。

對於標籤,你應該能夠做到

cat <path>/tag/${sha} | git mktag > .git/refs/tags/${TAG_NAME} 

那麼除了那你需要在通過所有的裁判和諸如此類的東西,這應該是文本文件已經所以這是一個直接複製。

祝你好運。 〜A