아래는 최신(2019/2/18현재) Raspbian stretch OS가 설치된 Raspberry pi 3(파이 3) 에 ROS Kinetic을 설치하는 과정을 정리한 것이다.


Intro


일반적인 amd64 Ubuntu 시스템에서는 apt install을 통해 ROS kinetic 을 설치할 수 있지만 파이3에 설치하기 위해서는 Source로부터 build하는 과정을 거쳐야한다.

ROS 위키에 정리된 내용은 http://wiki.ros.org/ROSberryPi/Installing%20ROS%20Kinetic%20on%20the%20Raspberry%20Pi 에 있지만 일부 과정이 설명이 부족하여 시행착오를 거쳐 정리하였다.


일부 과정은 아래 링크의 내용을 참고하였다.

https://neverbenever.wordpress.com/2017/12/20/install-ros-and-opencv-in-raspberry-piraspbian-stretch/


2019/2/20일 현재 최신 버전의 Raspbian 에 ROS-Kinetic 최소 버전(ROS-Comm)이 설치된 SD카드 이미지는 다음 링크에서 다운로드할 수 있다.

https://drive.google.com/file/d/13i6vCTXc-ZihoKoj3K01gEJaMW_RZWLk/view?usp=sharing

etcher등의 이미지 다운로드 프로그램을 통해 microsd카드에 쓰고 설치하면 된다.



1. Raspbian stretch 설치


Raspbian(라즈비안)은 파이3의 운영체제이다.

자세한 설치 과정은 아래 글을 참조한다.

라즈베리파이 디지털 액자 설정하기

https://kyubot.tistory.com/122?category=681568


2. ROS Kinetic 설치하기


2.1 SWAP 사이즈 변경


설치를 진행하기 앞서 100MB로 설정된 swap 사이즈를 1024MB로 변경한다.

/etc/dphys–swapfile 파일을 편집기로 열고 CONF_SWAPSIZE 부분의 값을 수정하고 저장한다.


# set size to absolute value, leaving empty (default) then uses computed value
# you most likely don't want this, unless you have an special disk situation
# CONF_SWAPSIZE=100
CONF_SWAPSIZE=1024

이제 변경된 swap size를 적용하기 위해 다음을 입력한다.

$ sudo /etc/init.d/dphys-swapfile stop
$ sudo /etc/init.d/dphys-swapfile start

주의: ROS 설치가 완료되면 Swap 사이즈를 반드시 100MB로 복원해주어야 한다.


2.2 ROS 저장소 설정하기


라즈비안 Stretch 운영체제에서 빠진 패키지를 추가해준다.

$ sudo apt-get install dirmngr


ROS 저장소를 apt 목록에 추가한다.

$ sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'

$ sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116

이제 apt 목록을 새로 업데이트 하고 최신 버전으로 업그레이드한다.

$ sudo apt-get update
$ sudo apt-get upgrade


2.3 Bootstrap 의존성 설치하기

$ sudo apt-get install python-rosdep python-rosinstall-generator python-wstool python-rosinstall build-essential cmake


2.4 rosdep 초기화하기

$ sudo rosdep init
$ rosdep update


2.5 catkin 작업공간 만들고 빌드하기

ROS 패키지를 다운로드하고 빌드하기 위해 작업공간( ros_catkin_ws )을 생성하고 해당 폴더로 이동한다.

$ mkdir -p ~/ros_catkin_ws
$ cd ~/ros_catkin_ws


2.6 ROS 패키지 설치

아래의 두가지 중 하나를 선택하여 설치를 진행한다.
(1) ROS-Comm 은 ROS를 설치하기 위한 최소 버전으로 GUI가 없는 패키지를 설치한다. (ROS에서 추천하는 방법이나 중요한 기능들이 빠져있어서 필요한 패키지들을 직접 컴파일해서 추가해야하는 번거로움이 있다.)

$ rosinstall_generator ros_comm --rosdistro kinetic --deps --wet-only --tar > kinetic-ros_comm-wet.rosinstall
$ wstool init src kinetic-ros_comm-wet.rosinstall


(2) ROS-Desktop: ROS, rqt, rviz와 같은 그래픽 도구들을 포함한 패키지들을 설치한다. (대부분의 필요한 기능들이 포함되지만 많은 용량을 필요로 한다.)

$ rosinstall_generator desktop --rosdistro kinetic --deps --wet-only --tar > kinetic-desktop-wet.rosinstall
$ wstool init src kinetic-desktop-wet.rosinstall


만약 wstool init 과정에서 실패 혹은 멈춤이 발생하는 경우 다음 명령어를 사용하여 패키지 다운로드를 재시작 할 수 있다.

$ wstool update -j4 -t src


의존성 패키지들이 모두 설치되어있는지 확인한다.

$ rosdep install --from-paths src --ignore-src --rosdistro kinetic -y


2.7 ROS 빌드 하기

$ sudo mkdir -p /opt/ros/kinetic
$ sudo chown pi:pi /opt/ros/kinetic
$ ./src/catkin/bin/catkin_make_isolated -j2 --install --install-space /opt/ros/kinetic -D

설치한 경로를 Source 한다.

$ source /opt/ros/kinetic/setup.bash

이제 roscore 를 실행하여 ros를 시작할 수 있다.


3. joy 노드 설치하기

roscore는 설치되었지만 실제로 로봇을 구동하기 위해서는 입출력을 할 수 있는 device를 설치해주어야한다.
대표적으로 joy node가 있다. 아래는 이 패키지를 설치하는 과정을 정리한 것이다.

3.1 joystick 드라이버 설치하기.

usb 조이스틱을 사용하기 위한 드라이버 패키지를 설치한다.

$ sudo apt-get install -y jstest-gtk joystick xboxdrv libusb-dev libbluetooth-dev


3.2 의존성 패키지 설치하기

ROS 패키지 빌드를 위해 필요한 라이브러리들을 설치한다.

$ sudo apt install -y python-defusedxml libpoco-dev libtinyxml2-dev libspnav-dev libx11-dev libcwiid-dev liblz4-dev


3.3 catkin 패키지 설치하기


앞서 생성한 ros_catkin_ws 작업 공간의 src 폴더에 필요한 ros 패키지들을 git 다운로드한다.

$ cd ~/ros_catkin_ws/src
$ git clone https://github.com/ros-drivers/joystick_drivers.git
$ git clone https://github.com/ros/common_msgs.git
$ git clone https://github.com/ros/diagnostics.git
$ git clone https://github.com/ros/pluginlib.git
$ git clone https://github.com/ros/class_loader.git
$ git clone https://github.com/ros/bond_core.git
$ git clone https://github.com/ros/roslint.git

다시 ros_catkin_ws로 이동하여 build 한다.

$ cd ~/ros_catkin_ws
$ catkin_make

만약 build error가 발생하면 해당 패키지가 완전히 다운로드 되었는지 확인한다.
컴파일이 완료되면 devel/setup.bash 파일을 source 하여 패키지를 등록한다.

$ source devel/setup.bash

catkin_ws에 설치된 패키지를 실행하려면 terminal 을 새로 열때마다 이 과정을 반복해줘야 하는데 
home의 .bashrc에 추가하면 자동으로 실행된다.

$ echo "source ~/ros_catkin_ws/devel/setup.bash" >> ~/.bashrc


터미널에서 아래와 같이 joy 노드를 찾을 수 있으면 성공이다.

$ rospack find joy
/home/pi/ros_catkin_ws/src/joystick_drivers/joy


4. ROS 실행 후 joy 노드 시작하기


이제 터미널을 3개 띄우고 roscore, joy_node 그리고 rostopic을 통해 메세지를 확인해보자.


$ roscore 실행



joy node 실행

$ rosrun joy joy_node



rostopic echo를 통해 joy 메세지 확인

$ rostopic echo joy



Modified MiniSkywalker Tiltrotor VTOL


아래는 Mini Skywalker 라는 고정익 비행기에 Tilt Rotor를 장착하여 수직이착륙형 비행기(VTOL)로 개조한 내용을 정리한 것이다.

기체는 https://hobbyking.com/en_us/mini-skywalker-840mm-arf.html 에서 구매하였다.

이 기체는 날개 폭 840mm 정도로 소형으로 가격이 저렴하면서 개조가 용이하고 비행 안정성도 어느정도 확보되어있다. 다만 일부 부분에 보강등이 필요하다. 자세한 내용은 아래 VTOL 개조하기 부분을 참조한다.



그림: miniSkywalker 기체


1. VTOL 에 관하여

VTOL 은 Vertical Take Off and Landing의 약자로 "수직으로 이착륙한다" 라는 의미이지만 통상적으로는 날개를 가지고 비행하는 항공기인데 이착륙을 헬기처럼 하는 비행기를 통칭한다. 대표적으로는 AV-8 헤리어나 MV-22 오스프리 같은 항공기가 있다.



하지만 이러한 비행기는  VTOL을 위해서 설계된 비행기이고 그 구조도 매우 복잡하므로 기존 기체를 개조하는 방식으로 접근하도록 한다.

사실 VTOL 비행기를 만드는 가장 간단한 방법은 기존의 고정익 비행기의 무게중심 부분에 4개의 날개를 가진 쿼드콥터를 얹는 방식이다. 대표적으로는 아래 그림과 같은 기체가 있는데 Funcup 이라는 고정익 비행기의 날개에 4개의 프로펠러를 장착할 수 있는 구조물을 만들고 수직비행 상태에는 드론처럼 비행하고 수평비행 상태에는 앞쪽의 프로펠러만 사용하여 비행하는 단순한 방식이다.


VTOL Funcup


자세한 방법은 https://docs.px4.io/en/frames_vtol/vtol_quadplane_fun_cub_vtol_pixhawk.html 에 잘 나와있다.

이러한 구조는 구현하기 쉬운 반면 수평비행 상태에서는 4개의 모터가 모두 놀게 되어 비행기에서 가장 꺼리는 죽은 하중(Dead weight)이 되고 만다. 그리고 비행중에 멈춰있는 프로펠러가 큰 항력을 발생시키므로 비행성능에도 악영향을 끼친다.


이러한 문제점을 해결하기 위해 나온 방식이 프로펠러를 수직과 수평 모든 상태에서 사용할 수 있도록 한 Tilt rotor형 항공기이다.


Tilt Rotor형 항공기(이하 틸트로터)는 비행기의 추력을 만드는 로터를 수직<-->수평 방향으로 변경하여 헬기와 같이 이/착륙 하며 수평상태로 변환 시 일반 비행기처럼 비행이 가능한 항공기로 대표적으로 MV-22 Osprey 혹은 한국항공우주연구원에서 개발한 스마트 무인기가 이에 해당한다.


 


이러한 방식의 항공기들은 공통적으로 프로펠러를 구동하는 엔진이 날개 끝에서 회전할 수 있다는 점을 확인할 수 있다.



RC 비행기로 상용 제품으로 구현된 기체는 E-Flite의 Convergence가 대표적이다.



이번에 제작한 기체는 바로 이 Convergence라는 기체에서 영감을 얻어 멀티로터 항공기처럼 모터의 회전수로 롤/피치 안정성을 확보하고 이 로터를 앞/뒤로 틸팅할 수 있는 틸트 서보를 장착하여 Yaw방향 안정성을 확보하는 방식이다. 자세한 내용은 아래 문서를 참고하면 된다.

https://docs.px4.io/en/frames_vtol/vtol_tiltrotor_eflite_convergence_pixfalcon.html


2. VTOL 구성


전제적인 구성은 E-flite 의 Convergence 기체를 바탕으로 Elevon으로 된 조종면을 Aileron, Elevator, Rudder 로 변경한 형태이다.

세부사항은 아래 그림과 같다.


그림. VTOL Skywalker 구성도


사용된 주요 부품은 다음과 같다.


추진용 모터: 레이싱 드론용 1806 size 2300kv BLDC 모터 3개

틸트용 서보모터: Corona CS238MG Metal Gear Servo 4.6kg / 0.14sec / 22g 서보 2개

조종면 제어용 서보모터: Sub micro 서보 4개


PX4의 제어 Output은 MAIN 8Pin + AUX 6 Pin으로 구성되어 있으며 각 핀은 아래 표와 같이 할당된다.


PX4 I/O

 Pin 번호

 역할

 MAIN

 1

 Motor Right

 2

 Motor Left

 3

 Motor Rear

 4

 Empty

 5

 Tilt Servo Right

 6

 Tilt Servo Left

 AUX

1

 Aileron

2

 Elevator

3

 Rudder


전체적인 시스템은 다음과 같다.

전체 시스템 구성도




3. VTOL 만들기


miniSkywalker 기체를 완성하기 위해 구매한 부품은 다음과 같다.


 

 품명 (키워드)

수량

 용도

구매 사이트

 1

 Mini Skywalker 840mm ARF

 1

 기체

 https://hobbyking.com/en_us/mini-skywalker-840mm-arf.html

 2

 Corona CS238MG Metal Gear Servo 4.6kg / 0.14sec / 22g

 2

 틸트 서보

 

 3

 HXT500 Micro Servo 0.8kg / 0.07sec / 6.2g

 3

 조종면 서보

 

 4

 Carbon Batten (1.0x4.0x1000mm)

 2

 기체 보강

 http://www.rcme.co.kr/shop/goods/goods_view.php?goodsno=6403156&category=023008

 5

 Pixhawk PX4

1

비행제어기
 

 6

 PX4 Airspeed sensor

1

기체속도 측정

 https://www.aliexpress.com/wholesale?catId=0&initiative_id=SB_20190123222452&SearchText=pixhawk+air+sensor


FC 장착 후 모습은 다음과 같다.




4. PX4 Flight Controller 설정하기


PX4는 비행제어를 위한 소프트웨어로 쿼드콥터, 헥사콥터, 고정익 비행기 등 다양한 형태의 무인 비행기를 지원하나 이번에 제작하는 VTOL같은 형태의 경우에는 비행 모드에 따라 다른 서보 출력, 모터 출력을 만들어야하므로 이에 해당하는 설정 파일을 작성해야한다.

이 과정은 px4 프로젝트에 대한 이해를 필요로 하는데 바로 Build 후 업로드하여 설치하고싶다면 다음 git 저장소에서 https://github.com/kyuhyong/Firmware  프로젝트를 다운받고 "vtol_skywalker" 브렌치로 Checkout 하면 된다.



A. Airframe 추가하기


PX4 는 다양한 기체 형태를 지원하기 위해 각각의 설정을 개별적으로 수정하는 대신 하나의 파일로 만들어서 Booting과정에서 해당 파일을 읽어드려 설정하는 방식을 사용하고 있다. 이렇게 하면 기체 설정 파일만 있으면 px4가 탑재된 보드에 쉽게 설정을 옮기고 업로드할 수 있게 된다.

해당 파일들은 Firmware/ROMFS/px4fmu_common/init.d 에 존재한다.


Firmware/ROMFS/px4fmu_common/init.d/13014_vtol_mini_skywalker 내용 추가


# @output MAIN1 Motor right
# @output MAIN2 Motor left
# @output MAIN3 Motor back
# @output MAIN4 Tilt servo right
# @output MAIN5 Tilt servo left
# @output AUX1 Aileron
# @output AUX2 Elevator
# @output AUX3 Rudder
param set VT_MOT_COUNT 3 #엔진 혹은 모터의 갯수
param set VT_FW_MOT_OFFID 3 #수평 비행상태일때 반드시 꺼져야하는 모터의 위치
param set VT_IDLE_PWM_MC 1200
param set VT_TYPE 1 # VTOL 타입. 0=Tailsitter (꼬리로 이착륙 하는 형태), 1=틸트로터형, 2=Standard 형태
param set VT_B_TRANS_DUR 1.0 # 이착륙 모드로 전환할 때 걸리는 시간(초)
param set VT_FW_DIFTHR_EN 1 # 전진방향 비행시 출력 디퍼렌셜 적용 여부
param set VT_FW_DIFTHR_SC 0.17 # 디퍼렌셜 출력의 스케일 게인: 러더 입력에 대한 출력 변화율
param set VT_FW_PERM_STAB 0 # 전진방향 비행시 Stabilization 적용 여부: 1로 설정하면 전진 비행시 무조건 Stabilize가 적용됨
param set VT_F_TRANS_DUR 1.2 # 전진방향 전환 시간(초) (최대 20초)
param set VT_F_TR_OL_TM 4.0 # 대기속도 센서가 없을 경우 전진방향 전환 시간(초) (최대 30초)
param set VT_TILT_FW 1.0 # 전진비행 시 틸트 서보의 위치 (0~1.0)
param set VT_TILT_MC 0.0 # 수직비행 시 틸트 서보의 위치(0~1.0)
param set VT_TILT_TRANS 0.45 # 전환 시 틸트 서보의 위치(0~1.0)
param set VT_TRANS_MIN_TM 1.2 # 전진방향 전환 최소 시간(초) (0~20.0)
param set VT_TRANS_P2_DUR 1.3 # 전진비행 2단계 전환 시간(초) (0.1~5.0) : 충분한 대기속도를 확보하여 고정익 항공기로
# 비행이 가능해질때까지 로터가 완전히 전진 방향으로 회전하는데 걸리는 시간
param set FW_ARSP_MODE 0 # 대기속도 모드: 0=노멀(가능하면 대기속도 사용), 1=대기속도 사용 안함
... 이하 생략


그리고 이렇게 추가한 설정 파일을 Build과정에 추가하기 위해

Firmware/ROMFS/px4fmu_common/init.d/CMakeList.txt에 위에서 편집한 파일명을 추가한다.


    13014_vtol_mini_skywalker



B.Mixer 파일 추가하기


위에서 만든 파일은 기체 설정, 제어 파라미터에 대한 설정일 뿐 실제 출력은 기체 형태와 서보의 배치, 구성에 따라 달라지므로 각각의 출력을 Mixing하는 과정이 필요하다. PX4에는 main과 aux 채널 각각에 대해 별도의 mixing을 적용할 수 있다. 자세한 방법은 https://dev.px4.io/en/concept/mixing.html 에 있는 문서를 참조한다.


Firmware/ROMFS/px4fmu_common/mixers/ 에서

메인 핀에 연결된 3개의 모터, 2개의 틸트 서보 출력을 위한 vtol_mini_skywalker.main.mix 파일을 추가하여 아래와 같이 편집한다.


# MiniBixler Tricopter Y-Configuration Mixer
# Motors
R: 3y 10000 10000 10000 0
Z:
Tilt mechanism servo mixer
---------------------------
#RIGHT up:2000 down:1000
M: 2
S: 1 4 0 -20000 10000 -10000 10000
S: 0 2 8000 8000 0 -10000 10000
#LEFT up:1000 down:2000
M: 2
S: 1 4 0 20000 -10000 -10000 10000
S: 0 2 8000 8000 0 -10000 10000


다시 AUX핀에 연결된 에일러론, 엘리베이터, 러더 출력을 위한 vtol_AER.aux.mix 파일을 추가한다.


Mixer for an AER VTOL
=======================
Aileron mixer
---------------
M: 1
S: 1 0 -7500 -7500 0 -10000 10000
Elevator mixer
--------------
M: 1
S: 1 1 10000 10000 0 -10000 10000
Rudder mixer
------------
M: 1
S: 1 2 -10000 -10000 0 -10000 10000


마찬가지로 새로 추가한 파일을 Build과정에 포함하기 위해

Firmware/ROMFS/px4fmu_common/mixers/CMakeList.txt 에 다음을 추가한다.

    vtol_minibixler.main.mix

    vtol_AER.aux.mix


Build 후 생성되는 px4fmu-v2_default.px4 펌웨어 파일을 QGC를 통해 보드에 다운로드 후 QGC를 재실행 하면 아래 그림과 같이 방금 생성한 Airframe을 선택할 수 있다.




5. 비행 결과


첫번째 비행 결과는 아래와 같았다.





비행 제어기에 설정된 기본 제어 게인으로 비행한 결과 생각보다 안정적으로 전환 및 비행이 이루어졌다.

다만 전진 비행모드에서 수직 비행모드로 전환 시 Throttle 입력이 너무 낮으면(40% 미만) 기체가 제자리에서 회전하는 현상이 발생하였다. 이것은 수직 모드에서 Throttle 이 낮으면 Torque를 상쇄하는 힘이 부족해서 발생하는 것으로 보인다.

때문에 하강시에는 주의하면서 고도를 낮추어야한다.


비행 결과는 아래에 공유한다.

https://logs.px4.io/plot_app?log=190dc440-6d61-4a78-b7ef-3efc18c6a0c3



2019/2/12 최초 문서 발행



 

아래 내용은 https://blog.github.com/2016-02-01-working-with-submodules/ 에 포스팅된 글을 번역 및 추가한 것이다.


복잡한 소프트웨어 프로젝트는 다른 프로젝트, 라이브러리 또는 프레임워크에 의존하게 되는 경우가 많다. Git(깃) 은 submodule(서브모듈)을 제공하여 이러한 과정을 돕는다. 서브모듈은 다른 repository(저장소)를 하나의 sub-folder로 추가할 수 있도록 한다.


Git 에서 Submodule을 사용하면 재사용되는 제네릭한 프로젝트들을 부모 프로젝트에서 분리해서 관리하기 쉽고 다른 프로젝트에 적용하기 쉽지만 사용하기가 번잡스러운 부분이 있다. 그래서 아래의 예를 통해 이해해보자.


서브모듈 추가하기


예를 들어 Slingshot(새총) 이라는 프로젝트를 개발중이라고 해보자. 이 프로젝트에는 y-shaped stickrubber-band라는 코드가 있다.


flickr photo shared by young@art under a Creative Commons ( BY ) license


이때, 다른 저장소에는 Rock 이라고 불리는 프로젝트가 있는데 이것은 그냥 일반적인(generic) rock 이라는 라이브러리일 뿐이지만 Slingshot에 적합하다고 가정해 보자.

그래서 slingshot 저장소에 이 rock이라는 저장소를 slingshot의 서브모듈로 추가하기 위해 다음을 입력한다:


git submodule add https://github.com/<user>/rock rock

<추가됨>

이렇게 추가된 서브모듈에 대한 정보는 root 폴더의 .gitmodules 에 아래와 같은 내용이 추가된 것을 확인할 수 있다.


[submodule "rock"]
	path = rock
	url = https://github.com/<user>/rock.git
	branch = master


또한 .git/config 에도 이 내용이 반영되어있다.


[submodule "rock"]
	url = https://github.com/<user>/rock.git

</추가됨>


이 시점에서 slingshot 폴더 안에 rock이라는 폴더가 생성되지만 사실 그 안에는 아무것도 존재하지 않는다.


새로운 버전의 깃 에서는 자동으로 내용물을 채우지만 이전 버전에서는 깃에서 rock의 내용을 명시적으로 다운로드해야 한다:


git submodule update --init --recursive


모든것이 잘 되었다면 이 변경점을 커밋하고 rock 폴더를 slingshot 저장소에 추가하게 된다.


깃허브에서는 rock 폴더 아이콘에 작은 표시를 붙여 이것이 서브모듈임을 나타낸다:


screen shot 2016-01-27 at 4 55 10 pm

rock 폴더를 클릭하면 rock 저장소로 이동하게 된다.


이제 rock 저장소를 slingshot 저장소에 추가하였고 rock의 모든 내용들을 slingshot에 포함된 것처럼 사용할 수 있다.

slingshot 저장소에서 실행한 깃 명령어는 "부모 저장소"에서 동작한다. 그리고 rock 폴더 안에서 실행한 명령어는 단지 rock 저장소에서 동작한다.

cd ~/projects/slingshot
git log # log shows commits from Project Slingshot
cd ~/projects/slingshot/rubber-band
git log # still commits from Project Slingshot
cd ~/projects/slingshot/rock
git log # commits from Rock
서브모듈을 사용하는 프로젝트에 참가하기

이제 여러분이 Slingshot 프로젝트에 참가하는 협업자라고 가정해보자. git clone을 사용하여 slingshot 의 내용물을 다운로드하기 시작한다. 이 시점에서  rock 폴더를 들여다보면 아무것도 없는것을 확인할 수 있다.
다시 말하지만 깃은 명시적으로 서브모듈을 다운로드할것을 기대한다. 여기서 git submodule update --init --recursive를 사용할 수도 있지만 아래와 같이 clone 명령어를 변경하여 서브모듈 내용물을 포함하여 다운로드할 수 있다.

git clone --recursive <project url>

서브모듈로 변경


이미 존재하는 서브폴더를 외부에 의존적인 폴더로 변경하는 것은 약간 복잡하다. 다음 예를 보자.


magic roll-back can 이라는 새로운 프로젝트를 시작하기로 했는데 여기에는 rubber-band가 유용하다고 가정하자. slingshot 을 위해 만든 rubber-band를 독립적인 저장소로 분리하고 이것을 두개의 프로젝트에 서브모듈로 추가해야 한다.


먼저 rubber-band 폴더의 내용물을 slingshot에서  추출한다. git filter-branch 명령을 사용하여 rubber-band와 관련된 커밋만을 남겨둘 수 있다. git filter-branch 명령어는 우리의 저장소 이력을 재작성 하여 마치 rubber-band 폴더가 원래 저장소에 포함되지 않은것처럼 보이게 한다. git filter-branch명령어에 대해 더 자세히 알아보려면 다음 글을 참조한다.


slingshot안에 있는 rubber-band 를 자체적인 저장소로 동작하게 하기 위해서 slingshot 의 복사본을 만든다. cp -r 명령어를 사용하여 slingshot의 전체 폴더를 rubber-band 라는 폴더로 재귀 복사 한다.


cd ..
cp -r slingshot rubber-band


rubber-band는 또 다른 slingshot과 동일하지만 이제부터 rubber-band 저장소로부터 git filter-branch 명령어를 실행한다.


cd rubber-band
pwd # (double check before proceeding!)
git filter-branch --subdirectory-filter rubber-band -- --all


이 시점에서 rubber-band 라는 폴더는 slingshot 프로젝트와 유사하게 보이지만 rubber-band 폴더의 파일과 커밋 히스토리만을 갖게 된다.

이 폴더를 slingshot에서 복사하였기때문에 새 저장소는 여전히 slingshot에서 설정한 리모트 트래킹 브랜치(remote tracking branch)를 갖고있다. rubber-bandslingshot 에 푸시(push)하면 안되고 새로운 저장소에 푸시해야한다.


이제 깃허브에서 rubber-band라는 새로운 저장소를 만들고 리모트(remote)를 rubber-band로 업데이트한다. remote origin 이라고 가정하면 아래와 같이 입력한다.


git remote set-url origin https://github.com/<user>/rubber-band


git push를 통해  새로운 "generic rubber-band 모듈"을 퍼블리쉬 하면 rubber-band를 분리하고 이것을 자체적인 저장소로 만들게 된다. 이제 slingshot 저장소에서 기존의 rubber-band 폴더를 삭제해야한다.


git rm -r rubber-band
git commit -m "Remove rubber-band (preparing for submodule)"


slingshot을 업데이트하여 rubber-band를 서브모듈로 사용하기 위해 다음을 입력한다.


git submodule add https://github.com/<user>/rubber-band rubber-band
git commit -m "rubber-band submodule"

rock을 추가할 때와 같이 저장소 안의 저장소를 갖게 되었다. 부모 저장소인 slingshot 그리고 두개의 "서브" 저장소인 rockrubber-band를 포함하여 세개의 저장소가 되었다.


게다가 slingshot의 히스토리를 들여다보면 rubber-band가 폴더일때 만들었던 커밋들을 재발견 할 수 있다. folder를 삭제하더라도 히스토리가 삭제되는것은 아니다. 이것은 때때로 혼란스러울 수 있는데, rubber-band "자식" 저장소가 기존의 slingshot 커밋의 복사되고 변경된 버전의 사본을 갖고있기 때문이다.


불행하게도 이 시점에 협업자들이 slingshot을 pull 하게 되면 rubber-band 비어있게 된다. 협업자들이 아래 명령어를 실행하여 서브모듈의 모든 내용물을 다운로드하도록 해야한다.


git submodule update --init --recursive


rubber-bandmagic roll-back can에 서브모듈로 추가하고 싶다면 slingshotrock을 추가한것처럼 반복하면 된다.


cd ~/projects/roll-back-can
git submodule add https://github.com/<user>/rubber-band rubber-band
git commit -m "rubber-band submodule"
git submodule update --init --recursive


'Computer > git' 카테고리의 다른 글

git 디렉토리 복사 후 복구  (0) 2018.10.10
git 에 사용자 정보 입력하기  (0) 2018.03.29
git 에서 새로운 브랜치 만들기  (0) 2018.02.02
git 의 오래된 항목 삭제하기  (0) 2018.01.22

+ Recent posts