
저는 C++(ROS) 프로젝트를 개발하는 팀에서 일하고 있습니다.
어떤 이유로 우리는 좋은 자식 관리를 하지 않습니다.
우리는 여러 개의 git 브랜치를 가지고 있습니다. 프로젝트를 컴파일하려면 git clone
각 브랜치에서 코드를 가져와서 디렉터리 구조를 다시 정렬해야 합니다.
먼저 그렇게 한 mkdir -p /home/me/repo
다음 git clone
각 브랜치에서 코드를 가져와 모두 /home/me/repo
.
이제 구조를 다시 정렬해야 합니다. 제가 한 작업은 다음과 같습니다.
#!/bin/sh
mkdir -p /home/me/project/src
cd /home/me/project/src
catkin_init_workspace # command of ROS to initialize a workspace
cp -r /home/me/repo/robot_dev/control .
cp -r /home/me/repo/robot_dev/control_algo .
cp -r /home/me/repo/sim/third_party .
cp -r /home/me/repo/planning .
cp -r /home/me/repo/robot_dev/cognition/hdmap .
cd ..
catkin_make # command of ROS to compile the project
프로젝트를 컴파일하기 위해 이와 같은 스크립트를 만들었고 작동합니다. 보시다시피 일부 디렉토리를 복사하고 재배열하여 컴파일했습니다.
cp -r
이제는 시간이 너무 많이 걸리기 때문에 좋은 생각 이 아니라고 생각합니다 . 나는 ln -s
와 같은 일을 하고 싶다 . 그래서 다음과 같이 또 다른 스크립트를 작성했습니다.
#!/bin/sh
mkdir -p /home/me/project2/src
cd /home/me/project2/src
catkin_init_workspace # command of ROS to initialize a workspace
ln -s /home/me/repo/robot_dev/control control
ln -s /home/me/repo/robot_dev/control_algo control_algo
ln -s /home/me/repo/sim/third_party third_party
ln -s /home/me/repo/planning planning
ln -s /home/me/repo/robot_dev/cognition/hdmap hdmap
cd ..
catkin_make # command of ROS to compile the project
그러나 오류가 발생합니다.
CMake Error at /opt/ros/kinetic/share/catkin/cmake/catkin_package.cmake:297 (message):
catkin_package() absolute include dir
'/home/me/project2/src/hdmap/../third_party/ubuntu1604/opencv-3.3.1/include'
확인해 보니 cd /home/me/project2/src/hdmap/../third_party/ubuntu1604/opencv-3.3.1/include
존재합니다.
cp -r
컴파일은 되는데 컴파일이 안되는 이유가 있나요 ln -s
?
답변1
..
심볼릭 링크의 경우 액세스가 실제로 예상한 대로 작동하지 않습니다.
Bash에서 이것을 시도하면 Bash는 "도움"을 시도하고 문제를 해결하기 위해 노력하므로 문제가 명확해지지 않습니다.
그러나 간단히 말해서, 로 이동하면 /home/me/project2/src/hdmap/../third_party
커널은 먼저 "hdmap"에 대한 심볼릭 링크를 확인하고 에 도달한 다음 상위 디렉터리를 /home/me/repo/robot_dev/cognition/hdmap
찾습니다...
저것hdmap 디렉토리이므로 /home/me/repo/robot_dev/cognition
거기에서 third_party를 찾으려고 시도합니다.
존재하지 않는 경우 /home/me/repo/robot_dev/cognition/third_party
(또는 존재하는 경우 원하는 것과 다른 경우 /home/me/repo/sim/third_party
) 파일을 찾을 수 없음 오류가 발생합니다.
Bash는 $PWD
변수를 유지하고 경로를 문자열로 저장하므로 ..
경로를 커널에 전달하기 전에 셸 자체에서 참조를 "해결"하는 데 도움이 될 수 있습니다. 이렇게 하면 이러한 세부 정보가 숨겨집니다.
bash 에서 (or)를 사용하여 set -P
이 동작을 비활성화 할 수 있습니다. set -o physical
(자세한 내용은 bash 매뉴얼 페이지를 참조하세요.)
근본적인 문제를 해결하는 데 도움이 되도록... 아마도 좋은 해결책은 cp -rl
복사 트리를 사용하는 것입니다. 하드 링크를 생성하는 -l
옵션 cp
. 이 경우에는 문제가 되지 않습니다. 특히 파일이 수정되는 것을 원하지 않는다고 가정하기 때문입니다. 여전히 데이터 구조를 반복하고 각 객체를 개별적으로 생성해야 하지만 아무것도 생성할 필요는 없습니다.
최신 파일 시스템(예: Btrfs)을 사용하는 경우 cp -r --reflink
CoW(기록 중 복사) 복제본을 생성해 볼 수도 있습니다. 본질적으로 하드 링크이지만 두 이름 사이에 연결이 없기 때문에 약간 더 좋습니다. 그들은 단지 백엔드에서 블록을 공유하고 파일 중 하나를 터치하면 실제로 두 개의 별도 파일로 분기됩니다. (하지만 하드 링크만으로도 충분할 것 같아요.)
아마도 git으로 몇 가지 트릭을 수행하여 각 단계에서 필요한 디렉토리를 노출할 수 있습니다. 그러면 실제로 필요한 부분을 복제할 수 있습니다. 하지만 이는 달성하거나 유지 관리하기가 더 어려울 수 있습니다.. cp -rl
바라건대 충분히 말했습니다!