환경 간 프로젝트 트리 공유

환경 간 프로젝트 트리 공유

공간과 시간을 절약하기 위해 대규모 프로젝트 트리를 네트워크 드라이브에 하드 링크로 복사했습니다.

cp -a -r --link proj proj_B

(배경: 규모가 크고 호환되지 않는 두 환경에서 재구축해야 하며 중간 및 프로덕션 위치 지정에 대한 지원이 제대로 이루어지지 않습니다. 따라서 환경 "B"에서 재구축하는 빠른 방법은 다음과 같습니다. 깨끗하게 복사한 후 및 "proj_B/에서 재구축한 후" obj" 두 환경 모두 LinuxMint 16에 있습니다).

이 접근 방식의 문제점은 이러한 트리 간에 편집 내용이 (안정적으로) 공유되지 않는다는 것입니다. 예를 들어 "proj/foo.cpp"에 편집 내용을 저장하면 새 inode를 가리키게 되는 반면 "proj_B/foo.cpp"는 여전히 가리키게 됩니다. 이전 버전으로(아마도 "save temp; mv orig temp2; mv temp orig; rm temp2"의 손실 회피 모드에서).

소스 코드를 공유하려면 소스 디렉터리에 대한 심볼릭 링크가 필요하다고 생각합니다(단, 바이너리 디렉터리가 분리되어야 하기 때문에 프로젝트 루트에 대한 심볼릭 링크뿐만 아니라). 예를 들면 다음과 같습니다.

cp -a -r --symbolic-link proj proj_B

그런 다음 바이너리 디렉터리의 링크를 해제합니다("현재 디렉터리에서는 상대적인 심볼릭 링크만 생성할 수 있습니다"라는 메시지와 함께 재귀적인 심볼릭 링크 복사가 실패하는 것을 제외하고. 그러나 "find -exec"를 사용하여 유사한 작업을 수행하거나 항복하고 스크립트를 작성할 수 있습니다).

하지만 그 전에, 온전한지 확인하고 싶습니다. 이를 달성하기 위한 더 나은 도구가 있습니까(예: 워록 수준의 rsync 플래그 조합과 같은)? 아니면 이 공유 방법은 눈물과 데이터 손실로 끝날 운명이며, 두 개의 복제본 사용을 그냥 포기해야 합니까(두 복제본 사이에 최신 변경 사항을 푸시/풀하는 것을 잊었다는 사실을 알게 되면 욕을 많이 할 것입니다)?

답변1

나는 하드 링크를 사용하지 않을 것이다. 일부 편집자는 파일을 저장할 때 하드 링크를 끊고 일부는 그렇지 않으며 일부는 구성할 수 있습니다. 그러나 파일을 저장할 때 하드 링크를 유지한다는 것은 파일이 그 자리에 기록된다는 것을 의미합니다. 즉, 기록 중에 시스템이 충돌하면 결국 불완전한 파일이 남게 됩니다. 이것이 새 파일에 저장하고 제자리로 이동하는 것이 바람직한 이유입니다. 그러나 이렇게 하면 하드 링크가 끊어집니다.

특히 대부분의 버전 제어 소프트웨어는 하드 링크를 깨뜨립니다. 그래서 하드 링크가 사라졌습니다.

기호 링크 포리스트에는 이 문제가 없습니다. 편집자가 마스터 사본을 가리키도록 해야 합니다. 아니면 편집자가 심볼릭 링크를 따라가는지 확인해야 합니다.

을 사용하여 심볼릭 링크 포리스트를 만들 수 있습니다 cp -as. 그러나 새 파일을 생성하는 경우 cp -as해당 심볼릭 링크를 생성하는 것이 불편합니다(작업은 수행되지만 대상이 이미 존재한다는 불만이 표시됩니다). 간단한 쉘 루프를 사용할 수 있습니다.

for env in environement1 environment2 environment3; do
  cd "../$env"
  find ../src \
       -type d -exec mkdir {} + \
       -o -exec sh -c 'ln -s "$@" .' _ {} +
done

답변2

이 접근 방식의 문제점은 이러한 트리 간에 편집 내용이 (안정적으로) 공유되지 않는다는 것입니다. 예를 들어 "proj/foo.cpp"에 편집 내용을 저장하면 새 inode를 가리키게 되는 반면 "proj_B/foo.cpp"는 여전히 가리키게 됩니다. 오래된 것.

이것은 정확하지 않습니다. 두 개의 하드 링크된 파일이 있는 경우 해당 파일의 내용은 항상 동일합니다. 편집자는 이를 변경해서는 안 됩니다.

파일을 편집해야 하는 경우 두 개의 디렉터리를 저장하려면 중앙 저장소와 같은 것이 필요한 것 같습니다. 아마도 더 나은 접근 방식은 프로젝트를 버전 제어(git과 같은) 하에 두는 것일까요?

답변3

cp와 유사한 구문을 허용하는 @Gilles의 답변 변환 형식(내 Bash 스크립트는 매우 간단하므로 경로 대체를 "-exec {}"로 압축하는 방법을 알 수 없습니다)

#/usr/bin/bash
if [ $# -ne 2 ] ; then  echo "Args: <original tree> <new tree of symlinks>" ; exit 1; fi
mkdir -p "$2"
srclen=${#1}
find "$1" | while read line
do
    sub=${line:$srclen}
    if [ -d "$line" ]
    then
        mkdir "$2$sub"
    else
        ln -s "$1$sub" "$2$sub"
    fi
done

관련 정보