.gitignore는 내 파일을 무시하지 않습니다!

오늘 저는 제 동료와 제가 git 매뉴얼을 확인하기 전에는 쉽게 설명할 수 없는 흥미로운 엣지 케이스를 만났습니다. git를 15년 동안 사용한 후에도 그 행동에 약간 놀랐기 때문에 세부 정보를 공유합니다. 운 좋게도 근본적인 이유를 이해했기 때문에 이제는 의미가 있습니다.

.gitignore가 무엇인가요?



버전 제어에 git을 사용하는 사람은 .gitignore, gitgit status와 같은 다양한 작업을 수행할 때 기본적으로 무시할 파일 이름 패턴git diff을 지정할 수 있는 git add 파일에 익숙할 것입니다. ) . 생성된 파일과 임시 파일을 무시하는 것은 매우 유용합니다. !로 시작하는 행을 추가하여 해당 패턴이 있는 파일을 무시하지 않도록 할 수 있습니다. 패턴은 위에서 아래로 평가되며 파일과 일치하는 마지막 패턴에 따라 무시 여부가 결정됩니다.

우리가 한 일



프로젝트를 체크아웃한 모든 컴퓨터에서 프로젝트의 .gitkeep 디렉토리를 보존하기 위해 간단한 tmp/pids 파일을 추가하려고 했습니다. 틀림없이 이 사소한 작업은 작동하지 않았고 작동하지 않는 이유를 파악하는 데 시간이 걸렸습니다.

# Lets git NOT ignore .gitkeep files, i.e. always check them in:
echo "!.gitkeep" >> .gitignore
touch tmp/pids/.gitkeep
git status
# ... tmp/pids/.gitkeep is NOT listed as new file


작동하지 않는 이유



그렇다면 방금 무시하지 않겠다고 말한 파일git이 여전히 무시되는 이유는 무엇입니까? 우리.gitignore에 이미 모든 임시 파일을 무시하는 편리한 줄이 포함되어 있기 때문입니다(체크인할 장소가 없기 때문입니다!).

/tmp/*


이 줄은 gittmp 내의 모든 파일과 디렉터리를 무시하도록 합니다. 이전 변경 사항이 원하는 결과를 얻지 못한 직접적인 이유이기도 합니다. manual 을 읽은 후 관련 비트(강조 광산)를 찾았습니다.

An optional prefix “!” which negates the pattern; any matching file excluded by a previous pattern will become included again. It is not possible to re-include a file if a parent directory of that file is excluded. Git doesn’t list excluded directories for performance reasons, so any patterns on contained files have no effect, no matter where they are defined.



무시되지 않는 디렉토리인지 확인하기 위해 무시된 디렉토리의 하위로 재귀하지 않는 것이 성능 관점에서 실제로 의미가 있습니다.

요약: 내용에 대한 규칙을 사용자 정의하려면 무시된 상위 디렉토리를 다시 포함해야 합니다.

git이 파일을 무시하지 않게 만드는 방법



새로운 지식을 사용하여 .gitignore를 업데이트합시다. 변경 후 git diff:

 /tmp/*
+!/tmp/pids
+/tmp/pids/*.pid
+!.gitkeep


여기서 작업 순서는 다음과 같습니다.
  • /tmp/* 및 모든 하위 항목
  • 무시
  • 추가 /tmp/pids 다시
  • .pid에 있는 모든 tmp/pids개의 파일 무시(그곳에서 생성된 유일한 파일이기 때문)
  • 전역적으로 활성화.gitkeep

  • 대안: –force 사용



    또는 git add --force tmp/pids/.gitkeep를 사용하여 .gitignore 규칙을 무시하면서 추가할 수 있습니다. 틀림없이 그것은 매뉴얼을 확인하고 그것에 대해 생각하는 것보다 빠르지만, 처음부터 작동하지 않는 이유를 배우는 것을 방해하기도 합니다.

    이것은 저에게 효과가 있었으므로 여러분에게도 도움이 되었으면 합니다. 문제가 발생하면 언제든지 또는 email을 통해 저에게 연락해 주세요. 저는 백엔드 시스템에 중점을 두고 코드 품질에 집착하는 경험이 있습니다Ruby software developer. 내가 제공하는 Ruby on Railsmaintenance services도 몇 가지 있습니다. 여전히 Rails 6으로 업그레이드해야 하는 경우 편리한 무료checklist를 가져오거나 제가 대신 하도록 요청하십시오.

    좋은 웹페이지 즐겨찾기