2013-02-08 21 views
12

Tôi có thư mục trang web được phiên bản bằng git. Tôi sử dụng submodules cho các thư viện cần thiết như Twitter Bootstrap, colorbox và lessjs vì tôi không nên theo dõi mã nguồn nhưng chỉ có phiên bản mã của họ mà tôi sử dụng.xuất khẩu git lưu trữ với các mô-đun con (git lưu trữ tất cả/đệ quy)

Bây giờ tôi muốn triển khai dự án và do đó tôi cũng cần mã phụ. Bằng cách sử dụng git archive Tôi không nhận được tệp/mã nguồn từ các mô-đun con.

Ba cách tiếp cận sau TRY để đạt được những gì tôi muốn nhưng dont't công việc: cách tiếp cận 1st

#!/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" 

Thomas Rast trong http://git.661346.n2.nabble.com/Running-git-archive-recursively-over-submodules-td4577012.html

này mang lại cho tôi lỗi cả trên Windows như trên Linux không tìm thấy tệp đối tượng nào.

cách tiếp cận thứ 2 https://github.com/meitar/git-archive-all.sh

Than phiền về mktemp không tìm thấy trên Windows. Và sửa chữa các cuộc gọi đến git archive (từ git-archive) không cho submodules trong tar ... :(

cách tiếp cận thứ 3 https://github.com/Kentzo/git-archive-all

là lỗi thời từ quan điểm của tôi do không tương thích với python mới nhất 3.3 và vẫn không hoàn toàn làm việc bằng cách sử dụng 2,7 vì samefile phàn nàn

vì vậy, câu hỏi của tôi bây giờ là:. có cách nào/cách tiếp cận gần đây để đối phó với xuất khẩu/lưu trữ một dự án git bao gồm submodules

?

Hoặc tôi có nên kiểm tra các subtrees cho quy trình làm việc này không?

Cảm ơn trước

+0

Tôi là tác giả của Kentzo/git-archive-all. Nó tương thích với python 3.3. Vấn đề khác là gì? – Kentzo

Trả lời

4

https://github.com/Kentzo/git-archive-all hiện đang làm việc dưới linux như @Kentzo đã nêu.

Trong môi trường Cygwin (với git và python được cài đặt thông qua trình cài đặt Cygwin), nó cũng hoạt động ở đó.

2

Chúng ta có thể làm một kịch bản bash nhanh chóng, nơi lưu trữ trong tar, mô-đun và sub-module, sau khi chúng tôi tiếp nhau hắc ín và nén, ở đây nó là một ví dụ với các module 2 phụ:

#!/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

Cách tiếp cận thứ 2 : https://github.com/meitar/git-archive-all.sh triển khai dưới dạng tập lệnh Bash độc lập và dường như vẫn được duy trì. Tôi tìm thấy nó là một cách dễ dàng để có một ảnh chụp nhanh bao gồm submodule nhanh chóng của một dự án. Nó thậm chí có thể chụp một phiên bản trước (loại, xem dưới đây):

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

Một vài vấn đề mà có thể hoặc không có thể ngắt thỏa thuận:

  • Tôi chạy vào vấn đề cố gắng sử dụng --format tùy chọn - nhưng mặc định, tar, thường hoạt động.

  • Vấn đề lớn (rất): Nó đã chụp môđun con của tôi, nhưng chỉ trong phiên bản hiện tại của nó - không phải phiên bản được chỉ định. Rất tiếc!

Là tập lệnh Bash, điều này có thể yêu cầu một số loại lớp tương thích với Linux (như Cygwin) được chạy trong Windows.


Dường như đây là khả năng tích hợp của Git - quá phức tạp để ghép mảnh cùng với tập lệnh. Tôi đoán không nhiều người sử dụng các mô-đun phụ hoặc git-lưu trữ, vì vậy thậm chí ít người muốn sử dụng cả hai.

+1

Lợi ích đáng chú ý của phương pháp này là * nó thậm chí có thể nắm bắt một bản sửa đổi trước đó * (mặc dù nó hóa ra không thực sự hiệu quả). Tôi không thấy làm thế nào để làm điều đó tự động với giải pháp @Kentzo. Các giải pháp @Sergio xuất hiện (loại) làm điều này, nhưng tôi chưa tự mình thử nghiệm nó. Tôi đoán bạn phải thực hiện kiểm tra thực tế (và cập nhật submodule) với * tất cả * của các giải pháp này - một thứ không cần thiết cho một 'git archive' thông thường. – nobar

1

Tôi đang sử dụng đoạn mã sau

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

để tạo ra một kho lưu trữ hoàn toàn một kho git với tất cả các môđun con.

Nếu bạn muốn trở thành ưa thích, bạn thậm chí có thể viết lại những nhận xét zip qua

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

Tất cả trên cửa sổ sử dụng infozip.

Các vấn đề liên quan