깃에서 Could not create directory.. 에러가 발생할 때

깃을 사용하다 이미 ssh 키가 있는데도, 아래와 같은 메시지를 에러를 보게 되었다면  사용자 폴더 경로를 제대로 찾지 못한 것이 원인이다.

Could not create directory '/c/Users/\301\244\277\353\275\304/.ssh'.
The authenticity of host '[1.2.3.4]:29418 ([1.2.3.4]:29418)' can't be established.
RSA key fingerprint is SHA256:ktXLozkk/PDTt0zeR3QI0MnsjOggY6tQWw41zkkyVF3tcn.
Are you sure you want to continue connecting (yes/no)?

아마도 사용자 폴더가 한글인 것이 문제인 듯 하다. 검색해보았으나 근본적인 해결책은 찾지 못했다. 아쉬운대로, 깃이 ssh를 참조할 때 참고하는 HOME 변수를 선언해주자. 시스템 변수에 선언해도 되지만, 사용자 변수에 선언하는 것으로 충분하다.

HOME_variable

그 후에, HOME의 경로에 .ssh 폴더를 복사해 붙여주자. 다시 깃 명령어를 실행해보면 해결되었을 것이다.

그 밖에

혹시 근본적인 해결책을 알게 되신다면 댓글로 남겨주세요 🙂

HOME 변수가 잘 선언되었는지 확인하려면 echo 명령어를 사용하자.

>echo %HOME%
D:\Users

 

 

gpg: signing failed: secret key not available

깃에서 커밋 시 -S 옵션을 통해 사인을 시도했으나, 다음과 같은 메시지가 나올 수 있다.

>git commit -S -m "your message"
gpg: skipped "your name <your.email@example.com>": secret key not available
gpg: signing failed: secret key not available
error: gpg failed to sign the data
fatal: failed to write commit object

결론만 이야기하면 원인은 두 가지다.

하나는 개인 키(secret key)가 없는 것이다. 아래의 명령어를 통해 개인 키가 있는지 여부를 확인할 수 있다.

>gpg --list-secret-keys
/home/yourname/.gnupg/secring.gpg
-----------------------------
sec#  4096R/488BA441 2013-03-13
uid                  your name <your.email@example.com>
ssb   4096R/69B0EA85 2013-03-13
ssb   4096R/C24C2CDA 2013-03-13

만약 아무런 데이터가 보이지 않는다면, 키가 없으니 만들어주면 된다.

다른 하나는 윈도우 사용자의 경우 GPG가 저장하는 키 저장소의 위치와 깃이 참고하는 키 저장소의 위치가 다르다. GPG는

[사용자 폴더]/AppData/Roaming/gnupg/

에 키를 보관하지만 깃은

[사용자 폴더]/AppData/.gnupg/

폴더를 참조한다.  해결책은 secring.gpg와 pubring.gpg, gpg.conf 파일을 깃이 참고하는 폴더로 복사해주면 된다.

그 밖에

gpg 명령어가 안된다면, GPG(GNU Privacy Guard)에서 도구를 다운받아 설치하자.

참고

깃에 GPG(GNU Privacy Guard) 설정

먼저 GPG(GNU Privacy Guard)가 뭔지 간단하게 살펴보자.  GPG는 RFC4880에 따라 OpenPGP를 완전하게 독립적으로 구현한 구현체다. 사용자의 데이터나 통신을 암호화하거나 사인할 수 있는 명령어 툴을 제공한다.

깃은 변경사항을 리파지토리에 저장할 때, 필요하다면 GPG를 이용해 사인을 하도록 지원한다.  여기서는 필요성 보다는 그래서 어떻게 설정하면 되는지 알아보자.

  1. 윈도우용 GPG 도구 설치
  2. 콘솔창에서 등록된 키가 있는지 확인 먼저 확인하자.
    >gpg -K
  3. 키가 없다면, 키를 생성한다. (기본값으로 대부분 충분)
    >gpg --gen-key
    gpg (GnuPG) 2.0.28; Copyright (C) 2015 Free Software Foundation, Inc.
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.
    
    Please select what kind of key you want:
       (1) RSA and RSA (default)
       (2) DSA and Elgamal
       (3) DSA (sign only)
       (4) RSA (sign only)
    Your selection?
    RSA keys may be between 1024 and 4096 bits long.
    What keysize do you want? (2048)
    Requested keysize is 2048 bits
    Please specify how long the key should be valid.
             0 = key does not expire
          <n>  = key expires in n days
          <n>w = key expires in n weeks
          <n>m = key expires in n months
          <n>y = key expires in n years
    Key is valid for? (0)
    Key does not expire at all
    Is this correct? (y/N) y
    
    GnuPG needs to construct a user ID to identify your key.
    
    Real name: your name
    Email address: your.email@example.com
    Comment:
    You selected this USER-ID:
        "your name <your.email@example.com>"
    
    Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o
    You need a Passphrase to protect your secret key.
    
    gpg: AllowSetForegroundWindow(1520) failed: 액세스가 거부되었습니다.
    
    gpg: AllowSetForegroundWindow(12472) failed: 액세스가 거부되었습니다.
    
    We need to generate a lot of random bytes. It is a good idea to perform
    some other action (type on the keyboard, move the mouse, utilize the
    disks) during the prime generation; this gives the random number
    generator a better chance to gain enough entropy.
    We need to generate a lot of random bytes. It is a good idea to perform
    some other action (type on the keyboard, move the mouse, utilize the
    disks) during the prime generation; this gives the random number
    generator a better chance to gain enough entropy.
    gpg: key A35FD1C6 marked as ultimately trusted
    public and secret key created and signed.
    
    gpg: checking the trustdb
    gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
    gpg: depth: 0  valid:   2  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 2u
    pub   2048R/A35FD1C6 2015-08-27
          Key fingerprint = 9442 AA8B A90E 8502 740B  1C9F 6D33 5225 A35F D1C6
    uid       [ultimate] your name <your.email@example.com>
    sub   2048R/9CB4DE6C 2015-08-27
  4. 사용자의 signingkey를 config에 등록한다.
    >git config --global user.signingkey A35FD1C6
  5. 필요하다면, 항상 사인하도록 config에 설정한다.
    >git config --global commit.gpgsign true
  6. 5번을 했다면, 아래와 같이 -S 옵션 없이 커밋할 수 있다.
    >git commit -m "your message."
  7. 커밋이 사인되었는지 아래와 같이 확인할 수 있다.
    >git log --show-signature
    commit 595d8f81aafe06c9dd6576658bde4c7b162580b8
    gpg: Signature made Thu Aug 27 13:10:46 2015     using RSA key ID A35FD1C6
    gpg: Good signature from "your name <your.email@example.com>"
    gpg: WARNING: This key is not certified with a trusted signature!
    gpg:          There is no indication that the signature belongs to the owner.
    Primary key fingerprint: 2413 CF8A 8F47 C668 E9A6  76BF D36D 2D40 CF1D 8C60
    Author: your name <your.email@example.com>
    Date:   Thu Aug 27 13:10:46 2015 +0900
    
        your message.
    

그 밖에

키를 잘못 만들었다면,

> gpg --delete-secret-keys A35FD1C6
...
> gpg --delete-keys A35FD1C6
...

순서로 삭제한다. 개인키(private key)를 먼저 삭제해야, 공개키(public key)를 삭제할 수 있다. 참고로, 한 번 삭제하면 복구가 불가능하므로 답이 없다.

참고로, 리누스(Linus)는 모든 commit을 사인하는 것은 올바르지 않다고 지적한 바 있다. 다른 사람에게 보낼 때 한번만 사인하는 것으로 충분하다는 것이다.

위의 가이드를 따랐는데도 여전히 아래와 같은 에러를 만난다면, 다음 글을 참고하자.

>git commit -m "your message"
gpg: skipped "your name <your.email@example.com>": secret key not available
gpg: signing failed: secret key not available
error: gpg failed to sign the data
fatal: failed to write commit object

참조