ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • bash에서 Git 저장소 파일내용 추가하기
    웹개발/시리얼통신 2019. 4. 17. 16:58

     

     

    git api를 이용해서 git 저장소 파일 내용을 새로운 내용으로 업데이트하는 것을 했었다.

    그런데 새로운 문자열을 기존파일에 추가하는 api는 따로 없는 듯하다.

    update 엔드포인트를 그대로 이용하되 업데이트하는 내용을 기존내용+추가내용으로 보내는 방법으로 시도했다.

    잘되긴하는데 절차가 번거롭다

    설정파일yml에 새로운 문자열(새로운 설정)을 추가하는 상황이다.

     

    원래 첫줄만 있던 파일에 2번째줄 내용을 추가했다

    원래 bash라는 값만 있던 파일에 append라는 값을 새로 추가하는 과정이다.

    기존내용과 새로운 내용 사이에 엔터 개행이 되어야한다.

    1 기존 content를 불러와 디코딩한후 변수에 저장

    처음 시도할때는 기존 content를 불러와 새로운 내용을 base64 인코딩후 append하면 된다고 생각했다.

    그런데 그러면 안된다....

    왜냐면 base64인코딩 방식이 원래 문자열과 1:1대응되지 않고 원본을 통채로 인코딩하는 방식이기에

    인코딩 결과일부가 원본 일부와 대응한다고 보면 안된다. 

    인코딩 결과는 더이상 쪼갤수없는 단위로 봐야한다.

     

    따라서 content를 불러와서 디코딩한후 추가하려는 문자열과 합쳐 인코딩해야한다..

    $ result=$(echo $(cURL -X GET https://api.github.com/repos/유저이름/저장소이름/contents/파일명|jq -r .content)|base64 --decode)

    curl로 content값을 불러와 ""는 제외해주고(jq다음의 -r) 디코딩한 값을 result라는 변수에 저장했다.

     

    2 추가할 문자열을 변수에 저장한다.

    $ str='append : this is the appended property'

     

    3 1과 2의 결과 사이에 \n 개행하여 base64 인코딩한 결과를 저장

    raw라는 변수에 1에서 만든 result와 2에서 만든 str변수값 사이에 개행을하고 base64로 인코딩하라는 명령이다.

    -e를 넣어준 이유는 \n 개행명령을 문자열로 해석하지 말라는 뜻이다. -e가 없으면 역슬래쉬+n이라는 문자열그대로 인식된다.

    $ raw=$(echo -e $result\n$str|base64)

    YmFzaCA6IHRoaXMgaXMgZnJvbSBiYXNoblxuYXBwZW5kIDogdGhpcyBpcyB0aGUgYXBwZW5kZWQg cHJvcGVydHkK

    변수 raw를 불러온 결과이다. 왜인지는 모르지만 중간에 공백이 생겼다.

    중간에 공백이 있으면 나중에 전송할때 JSON parsing 오류가 난다. 공백을 없앤다고 해서 원본이 달라지는것도 아니므로 공백을 없애주기로 한다.

     

    4 3의 결과에서 공백을 없앰

    $ raw=$(echo $raw|sed "s/ //g")

    echo 문자열|sed "s/바꿀문자열/새로운문자열/g" : 문자열에 포함된 바꿀문자열 모두 새로운 문자열로 바꾸라는 명령

     

    공백을 삭제하는 명령이다. g가 없으면 최초의 공백 1개만 제거한다.

     

    content로 보낼 변수 raw가 완성되었다

    5 curl로 git 저장소파일 업데이트

    cURL -i -X PUT -H "Authorization: token 내토큰값" -d "{\"message\": \"커밋메세지\", \"content\": \"$raw\", \"sha\": $(cURL -X GET https://api.github.com/repos/유저이름/저장소명/contents/파일명|jq .sha)}" https://api.github.com/repos/유저이름/저장소명/contents/파일명

    JSON 파싱오류가 날 경우 {"key":"value",...} JSON 고유의 형식이 지켜지고 있는지 확인하자.

    예를들어

     

    "key":"value"trashstring, ... 

    더블쿼트안에 값이 제대로 안들어간 경우

     

    "key":value

    값이 더블쿼트안에 있지 않은 경우

     

    "key1":"value1"  "key2":"value2"

    키값쌍 사이에 ,로 분리되지 않은경우 

     

    등등

    JSON 파싱이 안되는 원인은 다양하지만 아무튼 형식이 안지켜진것.

    value가 명령어로 구성된 경우 컴파일 결과를 볼수없어 어디가 틀렸는지 알아내기 쉽지않을수도 있다.

     

    댓글

Designed by Tistory.