2464

.gitリポジトリ ディレクトリなしでツリーのコピーを作成する、優れた "git export" ソリューションがあるかどうか疑問に思っていました。私が知っている少なくとも3つの方法があります。

  1. git cloneその後、.gitリポジトリ ディレクトリを削除します。
  2. git checkout-indexこの機能をほのめかしていますが、「目的のツリーをインデックスに読み込むだけ...」で始まります。これは、どうすればよいか完全にはわかりません。
  3. git-exportgit clone基本的に、一時的な場所に続いrsync --exclude='.git'て最終的な目的地に移動するサードパーティのスクリプトです。

これらの解決策のどれも、満足できるものではありません。svn exportどちらも最初にターゲットディレクトリを空にする必要があるため、最も近いのはオプション1かもしれません。しかし、ツリーをインデックスに読み込むことが何を意味するかを理解できると仮定すると、オプション 2 の方がさらに優れているように思えます。

4

31 に答える 31

2504

おそらくこれを実現する最も簡単な方法は、 を使用することですgit archive。展開されたツリーだけが本当に必要な場合は、次のようなことができます。

git archive master | tar -x -C /somewhere/else

ほとんどの場合、git から何かを「エクスポート」する必要があります。いずれにせよ圧縮されたアーカイブが必要なので、このようなことを行います。

git archive master | bzip2 >source-tree.tar.bz2

ZIP アーカイブ:

git archive --format zip --output /full/path/to/zipfile.zip master 

git help archive詳細については、非常に柔軟です。


アーカイブに .git ディレクトリが含まれていなくても、.gitignore、.gitattributes などの他の隠された git 固有のファイルが含まれていることに注意してください。アーカイブにそれらを入れたくない場合は、必ず.gitattributes ファイルで export-ignore 属性を使用し、アーカイブを行う前にこれをコミットします。続きを読む...


注: インデックスのエクスポートに関心がある場合、コマンドは次のとおりです。

git checkout-index -a -f --prefix=/destination/path/

(詳細については、グレッグの回答を参照してください)

于 2008-10-02T18:13:14.263 に答える
333

オプション 2 の意味がわかりました。リポジトリから、次のことができます。

git checkout-index -a -f --prefix=/destination/path/

パスの末尾のスラッシュは重要です。そうしないと、ファイルが /destination に「path」というプレフィックスが付いて配置されることになります。

通常、インデックスにはリポジトリのコンテンツが含まれているため、「目的のツリーをインデックスに読み込む」ために特別なことは何もありません。それはすでにそこにあります。

この-aフラグは、インデックス内のすべてのファイルをチェックアウトするために必要です (この状況でこのフラグを省略するとはどういう意味かわかりません。これは、私が望むことをしないためです)。この-fフラグは、出力内の既存のファイルを強制的に上書きしますが、これは通常、このコマンドでは行われません。

これは、私が探していた一種の「git export」のようです。

于 2008-10-02T03:03:35.993 に答える
265

git archiveリモートリポジトリでも動作します。

git archive --format=tar \
--remote=ssh://remote_server/remote_repository master | tar -xf -

リポジトリ内の特定のパスをエクスポートするには、git の最後の引数として必要な数のパスを追加します。

git archive --format=tar \
--remote=ssh://remote_server/remote_repository master path1/ path2/ | tar -xv
于 2008-12-09T18:59:01.560 に答える
73

ここに画像の説明を入力

リポジトリが GitHub でホストされている場合の特別なケースの回答。

を使用するだけsvn exportです。

私の知る限り、Github では許可されていませんarchive --remote。GitHub はsvn と互換性があり、すべての git リポジトリにsvnアクセスできるためsvn export、GitHub の URL を少し調整するだけで通常どおりに使用できます。

たとえば、リポジトリ全体をエクスポートするtrunkには、URL がどのように置き換えられるmasterか (またはプロジェクトの HEAD ブランチが に設定されているもの) に注意してください。

svn export https://github.com/username/repo-name/trunk/

また、単一のファイルまたは特定のパスまたはフォルダーをエクスポートできます。

svn export https://github.com/username/repo-name/trunk/src/lib/folder

jQuery JavaScript ライブラリを使用した例

HEADブランチまたはマスターブランチは、以下を使用して利用できますtrunk

svn ls https://github.com/jquery/jquery/trunk

HEAD ブランチには、次の場所でアクセスできます/branches/

svn ls https://github.com/jquery/jquery/branches/2.1-stable

同じ方法ですべてのタグを付けます:/tags/

svn ls https://github.com/jquery/jquery/tags/2.1.3
于 2013-10-30T17:03:24.200 に答える
42

Gitマニュアルから:

git-checkout-index を使用して「ツリー全体をエクスポート」する

プレフィックス機能により、基本的に git-checkout-index を「ツリーとしてエクスポート」機能として使用することが簡単になります。目的のツリーをインデックスに読み込み、次のようにします。

$ git checkout-index --prefix=git-export-dir/ -a

于 2008-10-02T02:27:07.253 に答える
39

git-checkout-index次のように使用できる単純なラッパーを作成しました。

git export ~/the/destination/dir

宛先ディレクトリがすでに存在する場合は、-fまたはを追加する必要があります--force

インストールは簡単です。スクリプトを のどこかにドロップし、PATH実行可能であることを確認してください。

の github リポジトリgit-export

于 2008-10-16T17:17:00.260 に答える
36

これは、SVN よりも Git の問題ではないようです。Git はリポジトリ ルートに .git フォルダーを配置するだけですが、SVN はすべてのサブディレクトリに .svn フォルダーを配置します。したがって、「svn export」は再帰的なコマンドライン マジックを回避しますが、Git では再帰は必要ありません。

于 2009-05-12T04:20:24.927 に答える
29

に相当する

svn export . otherpath

既存のレポ内は

git archive branchname | (cd otherpath; tar x)

に相当する

svn export url otherpath

git archive --remote=url branchname | (cd otherpath; tar x)
于 2012-02-23T15:41:55.123 に答える
24

ファイルを除外していない場合は.gitattributes export-ignore、試してくださいgit checkout

mkdir /path/to/checkout/
git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout -f -q

-f
インデックスからパスをチェックアウトするとき、マージされていないエントリで失敗しません。代わりに、マージされていないエントリは無視されます。

-q
冗長を避ける

さらに、SHA1 を追加するだけで、SVN のように任意のブランチまたはタグ、または特定のコミット リビジョンから取得できます (Git の SHA1 は SVN のリビジョン番号に相当します)。

mkdir /path/to/checkout/
git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout 2ef2e1f2de5f3d4f5e87df7d8 -f -q -- ./

/path/to/checkout/空である必要があります。Git はファイルを削除しませんが、警告なしに同じ名前のファイルを上書きします

更新:タグ、ブランチ、または SHA1 を使用してエクスポートにチェックアウトを使用するときに、斬首の問題を回避するか、作業リポジトリをそのままにしておくに-- ./は、最後に追加する必要があります

二重ダッシュ--は、ダッシュの後のすべてがパスまたはファイルであることを git に伝えます。また、この場合git checkoutHEAD

例:

このコマンドは、libsディレクトリと、readme.txtそのコミットからのファイルのみを取得します

git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout fef2e1f2de5f3d4f5e87df7d8 -f -q -- ./libs ./docs/readme.txt

my_file_2_behind_HEAD.txtこれにより、頭の後ろに2つのコミットが作成(上書き)されますHEAD^2

git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout HEAD^2 -f -q -- ./my_file_2_behind_HEAD.txt

別のブランチのエクスポートを取得するには

git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout myotherbranch -f -q -- ./

./リポジトリのルートに相対的であることに注意してください

于 2014-03-28T01:39:03.890 に答える
21

私はgit-submodulesを広く使用しています。これは私のために働きます:

rsync -a ./FROM/ ./TO --exclude='.*'
于 2011-09-13T06:26:03.070 に答える
20

gitリポジトリをエクスポートする方法を探しているときに、このページに頻繁にアクセスしました。この質問に対する私の答えは、svnが集中リポジトリアプローチに従っているため、svnexportがgitと比較して設計上持っている3つのプロパティを考慮しています。

  • すべてのリビジョンをエクスポートしないことにより、リモートリポジトリの場所へのトラフィックを最小限に抑えます
  • エクスポートディレクトリにメタ情報は含まれていません
  • svnを使用して特定のブランチをエクスポートするには、適切なパスを指定します

    git clone --depth 1 --branch master git://git.somewhere destination_path
    rm -rf destination_path/.git
    

特定のリリースを構築する場合、たとえば--branch stableまたはのように安定したブランチのクローンを作成すると便利です--branch release/0.9

于 2012-01-22T17:31:47.387 に答える
16

これにより、.dot ファイルを除くすべてのコンテンツがコピーされます。これを使用して、git のクローン プロジェクトを、.git を使用せずに Web アプリの git リポジトリにエクスポートします。

cp -R ./path-to-git-repo /path/to/destination/

普通の古いbashはうまく機能します:)

于 2010-12-10T17:17:49.350 に答える
13

クローンと同じくらい簡単で、.git フォルダーを削除します。

git clone url_of_your_repo path_to_export && rm -rf path_to_export/.git

于 2013-09-27T19:35:10.220 に答える
11

GitHub ユーザーの場合、エクスポート URL は ephemeralgit archive --remoteであるため、この方法は直接機能しません。GitHub に URL を尋ねてから、その URL をダウンロードする必要があります。 それを簡単にします:curl

curl -L https://api.github.com/repos/VENDOR/PROJECT/tarball | tar xzf -

これにより、ローカル ディレクトリにエクスポートされたコードが提供されます。例:

$ curl -L https://api.github.com/repos/jpic/bashworks/tarball | tar xzf -
$ ls jpic-bashworks-34f4441/
break  conf  docs  hack  LICENSE  mlog  module  mpd  mtests  os  README.rst  remote  todo  vcs  vps  wepcrack

編集
コードを特定の既存のディレクトリ (github のランダムなディレクトリではなく) に配置する場合:

curl -L https://api.github.com/repos/VENDOR/PROJECT/tarball | \
tar xzC /path/you/want --strip 1
于 2014-07-31T13:58:49.017 に答える
10

指摘したいのは、あなたが

  1. リポジトリのサブフォルダーをエクスポートします(SVNエクスポート機能を使用していた方法です)
  2. そのフォルダからすべてを展開先にコピーしてOKです
  3. リポジトリ全体のコピーが既に配置されているためです。

cp foo [destination]次に、前述の の代わりに使用できますgit-archive master foo | -x -C [destination]

于 2010-10-29T13:51:08.920 に答える
9

任意のコミットでリモート リポジトリを zip ファイルとしてアーカイブできます。

git archive --format=zip --output=archive.zip --remote=USERNAME@HOSTNAME:PROJECTNAME.git HASHOFGITCOMMIT
于 2012-10-09T13:49:55.980 に答える
8

サブモジュールで動作するものが必要な場合は、これを試してみる価値があります。

ノート:

  • MASTER_DIR = サブモジュールもチェックアウトしたチェックアウト
  • DEST_DIR = このエクスポートが終了する場所
  • rsync があれば、同じことをより少ないボールの痛みで行うことができると思います。

仮定:

  • MASTER_DIR の親ディレクトリからこれを実行する必要があります (つまり、MASTER_DIR cd .. から)。
  • DEST_DIR が作成されているものとします。これは、必要に応じて DEST_DIR の作成を含めるように変更するのは非常に簡単です。

cd MASTER_DIR && tar -zcvf ../DEST_DIR/export.tar.gz --exclude='.git*' . && cd ../DEST_DIR/ && tar xvfz export.tar.gz && rm export.tar.gz

于 2012-02-28T01:42:28.653 に答える
7

git-export の Bash 実装。

「git-archive」実装で再利用する目的で、.empty ファイルの作成と削除のプロセスを独自の機能に分割しました (後で投稿します)。

また、ターゲット エクスポート フォルダーから不要なファイルを削除するために、「.gitattributes」ファイルをプロセスに追加しました。「git-export」機能をより効率的にしながら、プロセスに冗長性を含めました。

EMPTY_FILE=".empty";

function create_empty () {
## Processing path (target-dir):
    TRG_PATH="${1}";
## Component(s):
    EXCLUDE_DIR=".git";
echo -en "\nAdding '${EMPTY_FILE}' files to empty folder(s): ...";
    find ${TRG_PATH} -not -path "*/${EXCLUDE_DIR}/*" -type d -empty -exec touch {}/${EMPTY_FILE} \;
#echo "done.";
## Purging SRC/TRG_DIRs variable(s):
    unset TRG_PATH EMPTY_FILE EXCLUDE_DIR;
    return 0;
  }

declare -a GIT_EXCLUDE;
function load_exclude () {
    SRC_PATH="${1}";
    ITEMS=0; while read LINE; do
#      echo -e "Line [${ITEMS}]: '${LINE%%\ *}'";
      GIT_EXCLUDE[((ITEMS++))]=${LINE%%\ *};
    done < ${SRC_PATH}/.gitattributes;
    GIT_EXCLUDE[${ITEMS}]="${EMPTY_FILE}";
## Purging variable(s):
    unset SRC_PATH ITEMS;
    return 0;
  }

function purge_empty () {
## Processing path (Source/Target-dir):
    SRC_PATH="${1}";
    TRG_PATH="${2}";
echo -e "\nPurging Git-Specific component(s): ... ";
    find ${SRC_PATH} -type f -name ${EMPTY_FILE} -exec /bin/rm '{}' \;
    for xRULE in ${GIT_EXCLUDE[@]}; do
echo -en "    '${TRG_PATH}/{${xRULE}}' files ... ";
      find ${TRG_PATH} -type f -name "${xRULE}" -exec /bin/rm -rf '{}' \;
echo "done.'";
    done;
echo -e "done.\n"
## Purging SRC/TRG_PATHs variable(s):
    unset SRC_PATH; unset TRG_PATH;
    return 0;
  }

function git-export () {
    TRG_DIR="${1}"; SRC_DIR="${2}";
    if [ -z "${SRC_DIR}" ]; then SRC_DIR="${PWD}"; fi
    load_exclude "${SRC_DIR}";
## Dynamically added '.empty' files to the Git-Structure:
    create_empty "${SRC_DIR}";
    GIT_COMMIT="Including '${EMPTY_FILE}' files into Git-Index container."; #echo -e "\n${GIT_COMMIT}";
    git add .; git commit --quiet --all --verbose --message "${GIT_COMMIT}";
    if [ "${?}" -eq 0 ]; then echo " done."; fi
    /bin/rm -rf ${TRG_DIR} && mkdir -p "${TRG_DIR}";
echo -en "\nChecking-Out Index component(s): ... ";
    git checkout-index --prefix=${TRG_DIR}/ -q -f -a
## Reset: --mixed = reset HEAD and index:
    if [ "${?}" -eq 0 ]; then
echo "done."; echo -en "Resetting HEAD and Index: ... ";
        git reset --soft HEAD^;
        if [ "${?}" -eq 0 ]; then
echo "done.";
## Purging Git-specific components and '.empty' files from Target-Dir:
            purge_empty "${SRC_DIR}" "${TRG_DIR}"
          else echo "failed.";
        fi
## Archiving exported-content:
echo -en "Archiving Checked-Out component(s): ... ";
        if [ -f "${TRG_DIR}.tgz" ]; then /bin/rm ${TRG_DIR}.tgz; fi
        cd ${TRG_DIR} && tar -czf ${TRG_DIR}.tgz ./; cd ${SRC_DIR}
echo "done.";
## Listing *.tgz file attributes:
## Warning: Un-TAR this file to a specific directory:
        ls -al ${TRG_DIR}.tgz
      else echo "failed.";
    fi
## Purgin all references to Un-Staged File(s):
   git reset HEAD;
## Purging SRC/TRG_DIRs variable(s):
    unset SRC_DIR; unset TRG_DIR;
    echo "";
    return 0;
  }

出力:

$ git-export /tmp/rel-1.0.0

「.empty」ファイルを空のフォルダーに追加しています: ... 完了。

インデックス コンポーネントのチェックアウト: ... 完了。

HEAD とインデックスのリセット: ... 完了。

Git 固有のコンポーネントをパージしています: ...

「/tmp/rel-1.0.0/{.buildpath}」ファイル...完了。

「/tmp/rel-1.0.0/{.project}」ファイル ... 完了。

「/tmp/rel-1.0.0/{.gitignore}」ファイル ... 完了。

「/tmp/rel-1.0.0/{.git}」ファイル ... 完了。

「/tmp/rel-1.0.0/{.gitattributes}」ファイル...完了。

「/tmp/rel-1.0.0/{*.mno}」ファイル ... 完了。

「/tmp/rel-1.0.0/{*~}」ファイル ... 完了。

「/tmp/rel-1.0.0/{.*~}」ファイル ... 完了。

「/tmp/rel-1.0.0/{*.swp}」ファイル ... 完了。

「/tmp/rel-1.0.0/{*.swo}」ファイル ... 完了。

「/tmp/rel-1.0.0/{.DS_Store}」ファイル ... 完了。

「/tmp/rel-1.0.0/{.settings}」ファイル ... 完了。

「/tmp/rel-1.0.0/{.empty}」ファイル ... 完了。

終わり。

チェックアウトされたコンポーネントをアーカイブしています: ... 完了。

-rw-r--r-- 1 管理ホイール 25445901 11 月 3 日 12:57 /tmp/rel-1.0.0.tgz

「git アーカイブ」機能を、「create_empty」機能とその他の機能を利用する単一のプロセスに組み込みました。

function git-archive () {
    PREFIX="${1}"; ## sudo mkdir -p ${PREFIX}
    REPO_PATH="`echo "${2}"|awk -F: '{print $1}'`";
    RELEASE="`echo "${2}"|awk -F: '{print $2}'`";
    USER_PATH="${PWD}";
echo "$PREFIX $REPO_PATH $RELEASE $USER_PATH";
## Dynamically added '.empty' files to the Git-Structure:
    cd "${REPO_PATH}"; populate_empty .; echo -en "\n";
#    git archive --prefix=git-1.4.0/ -o git-1.4.0.tar.gz v1.4.0
# e.g.: git-archive /var/www/htdocs /repos/domain.name/website:rel-1.0.0 --explode
    OUTPUT_FILE="${USER_PATH}/${RELEASE}.tar.gz";
    git archive --verbose --prefix=${PREFIX}/ -o ${OUTPUT_FILE} ${RELEASE}
    cd "${USER_PATH}";
    if [[ "${3}" =~ [--explode] ]]; then
      if [ -d "./${RELEASE}" ]; then /bin/rm -rf "./${RELEASE}"; fi
      mkdir -p ./${RELEASE}; tar -xzf "${OUTPUT_FILE}" -C ./${RELEASE}
    fi
## Purging SRC/TRG_DIRs variable(s):
    unset PREFIX REPO_PATH RELEASE USER_PATH OUTPUT_FILE;
    return 0;
  }
于 2011-11-01T18:27:58.020 に答える
7

私の好みは、実際には、コードの配布可能なアーカイブ (.tar.bz2、.zip、.jar、または適切なもの) をエクスポートする Makefile (または他のビルド システム) にdistターゲットを設定することです。GNU autotools または Perl の MakeMaker システムを使用している場合、これは自動的に存在すると思います。そうでない場合は、追加することを強くお勧めします。

ETA (2012-09-06): うわー、厳しい反対票。ソース コード管理ツールではなく、ビルド ツールを使用してディストリビューションをビルドする方がよいと私は今でも信じています。私は、ビルド ツールを使用してアーティファクトを構築することを信じています。私の現在の仕事では、私たちの主力製品はアリのターゲットで構築されています。私たちはソース コード管理システムを切り替えている最中であり、この ant ターゲットの存在は、移行の手間が 1 つ減ることを意味します。

于 2008-10-02T15:13:20.217 に答える
6

これにより、一連のコミット (C から G) のファイルが tar ファイルにコピーされます。注: これはコミットされたファイルのみを取得します。リポジトリ全体ではありません。ここから少し変更

コミット履歴の例

A --> B --> C --> D --> E --> F --> G --> H --> I

git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT C~..G | xargs tar -rf myTarFile.tar

git-diff-tree マニュアルページ

-r --> サブツリーへの再帰

--no-commit-id --> git diff-tree は、該当する場合、コミット ID を含む行を出力します。このフラグは、コミット ID の出力を抑制しました。

--name-only --> 変更されたファイルの名前のみを表示します。

--diff-filter=ACMRT --> これらのファイルのみを選択します。ファイルの完全なリストについては、こちらを参照してください

C..G --> このコミット範囲内のファイル

C~ --> コミット C からのファイルを含めます。コミット C 以降のファイルだけではありません。

| | xargs tar -rf myTarFile --> tar に出力

于 2014-04-25T17:47:12.190 に答える
5

私が見た中で最も簡単な方法は次のとおりです(Windowsでも機能します)git bundle

git bundle create /some/bundle/path.bundle --all

詳細については、この回答を参照してください: How can I copy my git repository to my windows machine from a linux machine via usb drive?

于 2015-04-05T21:47:57.720 に答える
4

簡単に言えば、これは .bash_profile の関数で、現在の場所でアーカイブを直接解凍し、最初に通常の [url:path] を構成します。注: この関数を使用すると、複製操作を回避でき、リモート リポジトリから直接取得できます。

gitss() {
    URL=[url:path]

    TMPFILE="`/bin/tempfile`"
    if [ "$1" = "" ]; then
        echo -e "Use: gitss repo [tree/commit]\n"
        return
    fi
    if [ "$2" = "" ]; then
        TREEISH="HEAD"
    else
        TREEISH="$2"
    fi
    echo "Getting $1/$TREEISH..."
    git archive --format=zip --remote=$URL/$1 $TREEISH > $TMPFILE && unzip $TMPFILE && echo -e "\nDone\n"
    rm $TMPFILE
}

.gitconfig のエイリアス、同じ構成が必要です (TAKE CARE .git プロジェクト内でコマンドを実行すると、以前にここで述べたように常にベース ディレクトリにジャンプします。これが修正されるまで、私は個人的にこの機能を好みます

ss = !env GIT_TMPFILE="`/bin/tempfile`" sh -c 'git archive --format=zip --remote=[url:path]/$1 $2 \ > $GIT_TMPFILE && unzip $GIT_TMPFILE && rm $GIT_TMPFILE' -
于 2010-03-19T16:12:52.750 に答える
3

@Aredridelの投稿が最も近かったと思いますが、それにはもう少しあるので、ここに追加します。問題はsvn、リポジトリのサブフォルダーにいて、次のことを行う場合です。

/media/disk/repo_svn/subdir$ svn export . /media/disk2/repo_svn_B/subdir

次に、svnリビジョン管理下にあるすべてのファイルをエクスポートします(それらは、新しく追加された、または変更されたステータスでもある可能性があります)-そして、そのディレクトリに他の「ジャンク」がある場合(ここではサブフォルダーをカウントしていませんが、ファイル.svnのような目に見えるもの) .o、エクスポートされませんSVN リポジトリによって登録されたファイルのみがエクスポートされます。私にとって良いことの 1 つは、このエクスポートには、まだコミットされていないローカルの変更を含むファイルも含まれていることです。もう 1 つの良い点は、エクスポートされたファイルのタイムスタンプが元のファイルと同じであることです。または、次のようsvn help exportに言えます。

  1. PATH1 で指定された作業コピーから、指定されている場合はリビジョン REV で、指定されていない場合は WORKING で、クリーンなディレクトリ ツリーを PATH2 にエクスポートします。... REV が指定されていない場合、すべてのローカル変更が保存されます。バージョン管理下にないファイルはコピーされません。

タイムスタンプが保持されないことを理解するにgitは、これらのコマンドの出力を比較します (git選択したリポジトリのサブフォルダー内)。

/media/disk/git_svn/subdir$ ls -la .

... と:

/media/disk/git_svn/subdir$ git archive --format=tar --prefix=junk/ HEAD | (tar -t -v --full-time -f -)

git archive...そして、いずれにしても、アーカイブされたファイルのすべてのタイムスタンプが同じになることに気付きました! git help archive言います:

git archive は、ツリー ID が指定された場合と、コミット ID またはタグ ID が指定された場合とで動作が異なります。最初のケースでは、現在の時刻がアーカイブ内の各ファイルの変更時刻として使用されます。後者の場合、参照されたコミット オブジェクトに記録されたコミット時刻が代わりに使用されます。

...しかし、どうやらどちらの場合も「ファイルの変更時間」を設定しています。したがって、これらのファイルの実際のタイムスタンプは保持されません!

したがって、タイムスタンプも保持するために、bashスクリプトを次に示します。これは実際には「ワンライナー」ですが、多少複雑ですが、以下に複数の行で投稿されています。

/media/disk/git_svn/subdir$ git archive --format=tar master | (tar tf -) | (\
  DEST="/media/diskC/tmp/subdirB"; \
  CWD="$PWD"; \
  while read line; do \
    DN=$(dirname "$line"); BN=$(basename "$line"); \
    SRD="$CWD"; TGD="$DEST"; \
    if [ "$DN" != "." ]; then \
      SRD="$SRD/$DN" ; TGD="$TGD/$DN" ; \
      if [ ! -d "$TGD" ] ; then \
        CMD="mkdir \"$TGD\"; touch -r \"$SRD\" \"$TGD\""; \
        echo "$CMD"; \
        eval "$CMD"; \
      fi; \
    fi; \
    CMD="cp -a \"$SRD/$BN\" \"$TGD/\""; \
    echo "$CMD"; \
    eval "$CMD"; \
    done \
)

コンテンツを「現在の」ディレクトリ (上記の/media/disk/git_svn/subdir) にエクスポートしていると想定されていることに注意してください。エクスポート先はやや不便ですが、DEST環境変数にあります。このスクリプトでは注意してください。DEST上記のスクリプトを実行する前に、手動でディレクトリを作成する必要があります。

スクリプトが実行された後、比較できるはずです。

ls -la /media/disk/git_svn/subdir
ls -la /media/diskC/tmp/subdirB   # DEST

...そしてうまくいけば、同じタイムスタンプが表示されます(バージョン管理下にあったファイルの場合)。

これが誰かに役立つことを願っています、
乾杯!

于 2014-07-15T14:16:48.943 に答える
2

サブモジュールも必要な場合は、これでうまくいくはずです: https://github.com/meitar/git-archive-all.sh/wiki

于 2012-08-23T15:05:20.980 に答える
1

私の .bashrc ファイルには次のユーティリティ関数があります。現在のブランチのアーカイブを git リポジトリに作成します。

function garchive()
{
  if [[ "x$1" == "x-h" || "x$1" == "x" ]]; then
    cat <<EOF
Usage: garchive <archive-name>
create zip archive of the current branch into <archive-name>
EOF
  else
    local oname=$1
    set -x
    local bname=$(git branch | grep -F "*" | sed -e 's#^*##')
    git archive --format zip --output ${oname} ${bname}
    set +x
  fi
}
于 2014-05-22T07:38:31.753 に答える