Git을 사용하여 파일을 "커밋 할 수없는"것으로 표시


41

내 작품 중 일부를 내 GitHub 계정에 업로드하여 과시하고 싶습니다. 그러나 데이터베이스 연결과 같이 비밀번호가 포함 된 파일이 있습니다.

Git에서 파일을 GitHub에 표시 할 수 없도록 Git에서 커밋 할 수없는 것으로 표시하는 방법이 있습니까?


1
접선 제안 : 일부 파일은 구성 파일과 매우 관련이 있기 때문에 모든 플랫폼에 적용 할 수는 없지만 환경에서 이러한 매개 변수를 유지하는 12 단계 접근 방식을 따르는 것을 고려할 수 있습니다. 12factor.net/config . 즉, 응용 프로그램 코드가 구성 파일이 있다고 가정하지 않도록하십시오. (이를 설정하지만 로컬 컴퓨터를 떠나지 않는 개인 시작 스크립트와는 반대).
millimoose

1
실수로 커밋 한 경우 전체 자식 히스토리에서 제거해야합니다 (다른 질문은 방법을 설명합니다). 삭제하고 무시하더라도 이전 커밋 된 버전은 히스토리에 남아 Github에서 볼 수 있기 때문입니다.
curiousdannii

3
모든 답변이 실제로 귀하의 질문에 답변되는 것은 아닙니다. 그들은 파일을 커밋 할 수 없도록하지 않으며 기본적으로 무시하도록 git을 구성합니다. 그러나 실수로 해당 파일 이름을 git 명령 줄에 삽입하면 의 패턴과 일치하더라도 커밋 될 수 있습니다.gitignore . AFAIK git는 모든 경우에 특정 파일을 커밋하지 않도록 100 % 완전 방지 방법을 제공하지 않습니다 . 이것은 기능으로 보일 수도 있지만 일반적인 구성을 무시하는 명시 적 명령을 허용합니다.
Bakuriu

하드 코드 된 비밀번호를 제거하고 더 안전한 대안으로 전환 할 수 있습니다. 그런 다음 데이터베이스 비밀번호를 전환 할 수 있습니다. 이전 암호는 여전히 커밋 내에 있지만 사용자가 읽을 수있는 것보다 오래된 암호는 구식입니다. 커밋이 이미 만들어진 후에는 커밋을 변경할 수 없다고 확신합니다.
BlueWizard

3
@curiousdannii가 말한 것 외에도 GitHub에는 실수로 저지른 민감한 데이터를 제거하는 방법에 대해 설명하는 전체 페이지가 있습니다. 무엇보다도이 페이지는 실수로 게시 한 모든 비밀번호와 키변경 하라는 메시지를 표시합니다. help.github.com/articles/remove-sensitive-data
Kevin-Reinstate Monica

답변:


67

Git에서 파일을 GitHub에 표시 할 수 없도록 Git에서 커밋 할 수없는 것으로 표시하는 방법이 있습니까?

먼저, 일부 파일과 커밋을 로컬 Git 리포지토리에 표시 할 수는 없지만 GitHub에서는 볼 수 없습니다. Git에 커밋 된 파일이 있으면 GitHub에 표시됩니다.

둘째, 개별 파일 자체를 "커밋 할 수없는"것으로 표시하는 간단하고 실용적인 방법은 없습니다. 그러나 Git 리포지토리에서 파일을 무시하는 방법 은 확실 합니다. .gitignore파일에 필요한 것 :

.gitignore파일이 망할 놈의 무시하도록 의도적으로 비 추적 파일을 지정합니다. Git이 이미 추적 한 파일은 영향을받지 않습니다. 자세한 내용은 아래 참고를 참조하십시오.

기본 .gitignore텍스트 파일은 평범한 텍스트 파일이기 때문에 매우 간단합니다. 예를 들어 config.php루트에 파일이 있으면 이렇게 할 수 있습니다. PHP를 사용한다고 가정하지만이 개념은 모든 설정에 적용됩니다. 또한이 예제에서 Nano를 텍스트 편집기로 사용하고 있지만 일반적으로 여기에 사용하는 텍스트 편집기를 자유롭게 사용하십시오.

nano .gitignore

그리고 파일 이름을 해당 파일에 추가하십시오.

config.php

저장하면 Git은 단순히 해당 파일을 무시합니다.

즉, 이와 같은 설정을 위해 내가하고 싶은 일은 저장소에 민감한 세부 사항을 제외하고 샘플 / 예제 구성을 유지하는 것이므로 구성 파일 형식이 다음과 같은 이름의 파일이 무엇인지에 대한 참조가 있습니다.

config.SAMPLE.php

그렇게하면 config.php파일을 어떻게 설정 해야하는지 정확히 알 config.SAMPLE.phpconfig.php있으며 Git이 실제 파일을 건드리지 않도록 할 수 있습니다 .

또한 코드를 과시하려는 경우 누군가가 해당 코드를 가져와 어떤 방식으로 자체 시스템에 구현하려고 할 것입니다. 우리는 귀하가 아니며 귀하의 저장소에 샘플 구성 파일이 없으면 사람들은 코드를 스스로 구현하는 방법을 실제로 이해하지 못합니다. 기본 구성 예제를 제공하지 않았기 때문에 유능하지 않다고 생각할 수도 있습니다.


11
정답 샘플 구성 파일을 제안하면 +1입니다 . Figaro for Ruby 와 같은 라이브러리가 있습니다 . 코드를 보는 사람이 환경이 어떤 모습인지 알 수 있도록 실제 값과 비슷한 값으로 커밋 된 샘플 파일이 있어야합니다. Heroku와 같은 일부 플랫폼은 환경 변수를 사용하므로 구성을 다음과 같은 것으로 설정 database_url = Environment.DATABASE_URL하고 위와 같은 주석을 남길 수 # postgres://username:password@localhost/dbname있습니다.
Chris Cirefice

@ChrisCirefice 감사합니다! 다른 사람이이 코드를 읽을 경우 구성이 어떻게 작동하는지 설명하지 않고 정확히 무엇을 설명해야합니까? 다시 감사합니다.
JakeGould

27

사전 커미트 후크를 추가하여 상태 점검을 구현할 수도 있습니다. .git/hooks모든 git 저장소 의 디렉토리 에는 샘플 스크립트가 있습니다.

호출 된 스크립트 pre-commit는 각 커밋 전에 존재하고 0이 아닌 반환 값이 커밋을 중단하면 실행됩니다.

예를 들어 다음과 같은 간단한 스크립트를 사용할 수 있습니다.

#! /bin/sh -e
git ls-files --cached | grep -qx 'filename' && { echo "Excluded file included in the commit" >&2; exit 1; }
exit 0

그리고 filename일치하면 커밋이 실패합니다.


1
+1 이것은 실제로 파일을 명시 적으로 추가 및 커밋하지 못하게하는 정답입니다.
R ..

실제로 권장되는 방법은이 예방책을 사용하지 않는 것입니다 (즉, 대신`.gitignore 사용).
David Z

2
@R .. 예, 아니오 "파일을 ucommitable로 표시"라는 질문은 "파일이 커밋되지 않도록 방지"하는 것입니다. 실제로 .gitignoreGit을 사용하는 모든 사람들에게 실제로 생성되는 것은 매우 일반적이며 일반적으로 이해되는 연습입니다. 그러나 대부분의 Git 사용자는 사전 커밋 스크립트를 사용하지 않습니다. 설정에 대한 지식이 필요하며 .gitignore파일을 사용하는 것보다 이와 같은 방법이 선호되는 진정한 이유가 필요 합니다. 그러나 이것은 좀 더 복잡한 경우에 매우 유용하지만 실제로 사용해야한다는 것을 알고있을 때 사용하는 개념입니다.
JakeGould

2
.gitignore를 100 % 신뢰하지 않는 상황에서 이것을 사용하는 것을 볼 수 있습니다 (어리석은 실수로 git이 커밋을 위해 파일을 추가하도록 요구 할 수 있습니다). 또는 다른 누군가가 .gitignore 파일을 편집 할 수 있습니다 (결국 버전 제어를 받고 있음). 실제로 테스트 가능한 프로세스가 필요한 경우 이러한 프로세스를 수행 할 수 있습니다.
Cort Ammon 1

@CortAmmon 항상 신뢰에 관한 것은 아닙니다. 당신은 몇 가지 추가 할 수 있습니다 일시비공개 커밋 싶지 않아 소스 코드에 디버그 정보를하지만 당신은 같은 파일을 무시할 수 없다. 대신 불법이 포함되어 있지 않은 경우 커밋하기 전에 확인하고 싶습니다 . 이것은이 사용 사례에 대한 좋은 솔루션처럼 보입니다. 사실 사실 이것은 유스 케이스이기 때문에이 질문을 찾은 방법입니다.
t3chb0t

12

@JakeGould가 말한 것. 어떤 경우에는 당신은 또한 같은 특수 파일 비트의 사용을 만들 수 skip-worktree또는 assume-unchanged그 다음의 방법을 설정할 수 있습니다; 이 둘의 차이점에 대해서는이 스택 오버플로 답변을 참조하십시오 .

git update-index --assume-unchanged <file>

그러면 기존 파일에 대한 추가 변경 사항을 숨기고 파일을 가져올 때마다 파일을 실제로 원할 때 사용할 수 있습니다. 그러나 당신이하고있는 일을 정말로 알고있는 경우에만 사용하는 것이 좋습니다.


8

.gitignore@JakeGould와 같은 것을 사용하십시오 . 또한 일부 관련 정보 :

  • .gitignore파일 추적을 방지합니다. 이미 추적 된 경우 git rm --cached제거를 위해 사용 하십시오.
  • 파일 / 패턴 $GIT_DIR/info/exclude도 무시됩니다
  • 사용자의 core.excludesFile에 의해 지정된 파일의 파일 / 패턴 ~/.gitconfig도 무시됩니다.

자세한 내용 은 공식 Git 설명서 를 참조하십시오.


2

Jake와 46의 답변을 확장하려면 : 아주 좋은 방법 중 하나는 개인 정보를 포함하는 파일에 대해 일관된 확장자를 사용 .gitignore하고 항상 해당 확장자를 가진 파일을 전역에서 항상 제외시키는 것입니다 ( .gitconfig다른 곳에서 언급 한 파일을 사용하여 항상 무시하도록하는 것) 귀하의 사용자를 위해).

그런 식으로 예를 들면 다음과 같습니다.

/projectname/mypasswords.exc 

*.exc전 세계에서 제외한 경우 특정 파일을 개별적으로 제외하는 것을 잊어 버린 경우에도 커밋되지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.