@Aredridelの投稿が最も近かったと思いますが、それにはもう少しあるので、ここに追加します。問題はsvn
、リポジトリのサブフォルダーにいて、次のことを行う場合です。
/media/disk/repo_svn/subdir$ svn export . /media/disk2/repo_svn_B/subdir
次に、svn
リビジョン管理下にあるすべてのファイルをエクスポートします(それらは、新しく追加された、または変更されたステータスでもある可能性があります)-そして、そのディレクトリに他の「ジャンク」がある場合(ここではサブフォルダーをカウントしていませんが、ファイル.svn
のような目に見えるもの) .o
、エクスポートされません。SVN リポジトリによって登録されたファイルのみがエクスポートされます。私にとって良いことの 1 つは、このエクスポートには、まだコミットされていないローカルの変更を含むファイルも含まれていることです。もう 1 つの良い点は、エクスポートされたファイルのタイムスタンプが元のファイルと同じであることです。または、次のようsvn help export
に言えます。
- 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
...そしてうまくいけば、同じタイムスタンプが表示されます(バージョン管理下にあったファイルの場合)。
これが誰かに役立つことを願っています、
乾杯!