2013-02-08 246 views
12

我有一個網站目錄版本與git。我爲Twitter Bootstrap,colorbox和lessjs等需要的庫使用子模塊,因爲我不應該跟蹤源代碼,而只會跟蹤我使用的代碼版本。git檔案導出子模塊(git歸檔所有/遞歸)

現在我想部署項目,因此我也需要子模塊代碼。 通過使用git archive我沒有從子模塊獲得源文件/代碼。

以下三種方式努力實現我想要什麼,但dont't工作:在http://git.661346.n2.nabble.com/Running-git-archive-recursively-over-submodules-td4577012.html

1的方法

#!/bin/sh 

export revision="$1" 

export GIT_INDEX_FILE=".git/tmpindex" 
rm -f "$GIT_INDEX_FILE" 

git read-tree $revision 

export up="$(pwd)" 

read_one_level() { 
     export GIT_ALTERNATE_OBJECT_DIRECTORIES="$GIT_ALTERNATE_OBJECT_DIRECTORIES":$(
      git submodule foreach 'echo "$up/$path/.git/objects"' | 
      grep -E -v '^(Entering|No submodule mapping found)' | 
      tr '\n' : | 
      sed 's/:$//' 
     ) 

     git submodule foreach ' 
       cd "$up" 
       subcommit=$(git rev-parse :"$path") 
       git rm --cached "$path" 
       git read-tree -i --prefix="$path/" $subcommit 
     ' >/dev/null 
} 

while git ls-files -s | grep -q ^160000; do 
    read_one_level 
done 

git archive --format=tar $(git write-tree) 

rm -f "$GIT_INDEX_FILE" 

托馬斯·拉斯特這讓我既在Windows上的錯誤,如Linux的沒有找到任何對象文件。

第二個方法 https://github.com/meitar/git-archive-all.sh

抱怨mktemp的Windows上沒有找到。和更正調用git archive(從git-archive)不給在焦油子模塊... :(

3方法 https://github.com/Kentzo/git-archive-all

是從我的觀點因爲不是以最新的Python 3.3兼容的過時,但仍不能完全使用2.7,因爲samefile抱怨工作

所以我的問題是現在: 有什麼辦法近來/方法來處理導出/存檔Git項目包括子模塊

或者我應該檢查這個工作流程的子樹嗎?

在此先感謝

+0

我是Kentzo/git-archive-all的作者。現在是Python 3.3兼容。另一個問題是什麼? – Kentzo 2013-05-13 07:41:33

回答

2

我們可以做一個快速的bash腳本,其中焦油,模塊和子模塊存檔,以後我們串接焦油和壓縮,在這裏它與2子模塊的例子:

#!/bin/bash 

set -e 

pwd=$(pwd) 
date=$(date +%Y%m%d) 
package=gitreponame 
branch=master 
name=tarbz2name 
submodule1=/src/app/sub1/ 
submodule2=/src/sub2/ 

pushd ${package} 
git checkout ${branch} 
git pull 
tag=$(git rev-list HEAD -n 1 | cut -c 1-7) 
git archive --prefix="${name}/" --format=tar master > "$pwd"/${name}-${date}-${tag}.tar 

git submodule update --init 

cd ${submodule1} 
git archive --prefix="${name}${submodule1}" --format=tar master > "$pwd"/sb1.tar 
cd - 

cd ${submodule2} 
git archive --prefix="${name}${submodule2}" --format=tar master > "$pwd"/sb2.tar 
popd 

tar -Af ${name}-${date}-${tag}.tar sb1.tar 
tar -Af ${name}-${date}-${tag}.tar sb2.tar 
bzip2 ${name}-${date}-${tag}.tar 
rm sb1.tar sb2.tar 
1

第二屆辦法:https://github.com/meitar/git-archive-all.sh作爲一個獨立的Bash腳本部署,似乎仍然保持。我發現它是一種簡單的方法,可以快速獲取項目的子模塊快照。它甚至可以捕捉到一個較早的版本(排序的,見下文):

git-archive-all.sh --tree-ish (tag) ## for example 

一對夫婦的問題,可能會或可能不會交易破壞者:

  • 我跑進嘗試使用問題--format選項 - 但默認情況下,tar,一般工作。(非常)大問題:它捕獲了我的子模塊,但只在其當前版本中 - 而不是指定的版本。哎呦!

作爲Bash腳本,這可能需要某種Linux兼容層(如Cygwin)在Windows下運行。


看起來這應該是Git的內置功能 - 它與腳本編寫在一起太複雜了。我想沒有多少人使用子模塊 git-archive,所以更少使用兩者。

+1

這種方法的顯着優點是*它甚至可以捕獲早期版本*(儘管事實證明它並不真正起作用)。我不知道如何自動使用@Kentzo解決方案。 @Sergio解決方案似乎(有點)這樣做,但我還沒有自己測試過。我想你必須用這些解決方案的全部*做一個實際的結帳(和子模塊更新) - 這是常規的'git archive'不需要的東西。 – nobar 2015-04-27 18:36:44

1

我用下面的代碼

git archive -o release.zip HEAD 
git submodule --quiet foreach 'cd $toplevel; zip -ru release.zip $path' 

創建的所有子模塊一個Git倉庫的一個完整的存檔。

如果你想成爲看上你可以使用infozip甚至重寫Windows上通過

echo -e "Repository:\n$(git rev-parse HEAD)\nSubmodule status:\n$(git submodule status)" | zip -u release.zip -z 

所有的zip評論。