Git 리포지토리에 파일을 유지하지만 변경 사항을 추적하지 마십시오


305

CodeIgniter 사이트에는 리포지토리에 있고 싶지만 변경 사항을 추적하지 않을 파일이 여러 개 있습니다.

예를 들어,이 프레임 워크의 새 설치를 새 클라이언트에 배포하고 다음 파일을 다운로드하고 (기본값은 CHANGEME 임)이 클라이언트에 맞게 변경해야합니다 (데이터베이스 자격 증명, 전자 메일 주소 정보, 맞춤 CSS).

// the production config files i want the files but they need to be updated to specific client needs
application/config/production/config.php
application/config/production/database.php
application/config/production/tank_auth.php
// index page, defines the environment (production|development)
/index.php
// all of the css/js cache (keep the folder but not the contents)
/assets/cache/*
// production user based styling (color, fonts etc) needs to be updated specific to client needs
/assets/frontend/css/user/frontend-user.css

현재 내가 달리면

git clone git@github.com:user123/myRepo.git httpdocs

위의 파일을 편집하면 좋습니다. 핫픽스 또는 패치를 해제하고 실행할 때까지 git pull. 그런 다음 모든 변경 사항을 덮어 씁니다.





클라이언트 자격 증명 / 구성 파일을 무시하고 리포지토리를 설치할 때 누락 된 경우 프로그램에서 기본 파일을 빌드하도록 할 수 있습니까?
MatthewG

답변:


618

git은 다른 해결책을 가지고 있습니다. 먼저 추적하지 않으려는 파일을 변경하고 다음 명령을 사용하십시오.

git update-index --assume-unchanged FILE_NAME

변경 사항을 다시 추적하려면 다음 명령을 사용하십시오.

git update-index --no-assume-unchanged FILE_NAME

git-update-index 문서


나는 당신이 말한 것을했지만 git status는 파일이 수정
되었다고

7
예, 이것은 "허용 된 답변"이어야합니다. 나를 위해 일했다.
joshmcode

34
Junio ​​Hamano (Git의 관리자)에 따르면 "Git의 관리자는 무시 메커니즘을 남용해서는 안된다. [...] Git이 항상 이러한 경로가 수정되지 않은 것으로 간주한다는 것은 Git의 약속이 아니다. 추가 lstat (2) 비용을 발생시키지 않고 변경되지 않은 것으로 가정 된 경로를 판별 할 수 있으며, 경로가 수정되었음을보고 할 권리가 있습니다 (결과적으로 "git commit -a"는 변화)." 즉, 변경되지 않은 것으로 가정하면 로컬 성능 문제에만 해당됩니다. Git이 해당 파일이 더 가벼운 방식으로 변경된 것을 확인할 수 있다면 그렇게됩니다.
Alejandro García Iglesias

41
정보를 읽으면 --skip-worktree옵션보다이 작업에 더 적합 하다고 생각합니다 --assume-unchanged.
PJSCopeland

26
--skip-worktree가 실제로 더 나은 옵션입니다. 추가 정보 : stackoverflow.com/questions/13630849/…
Customizer

80

다른 답변의 의견에서 답변을 가져 오려면 :

$ git update-index --skip-worktree FILENAME

더 나은 옵션으로 보입니다 --assume-unchanged

이것에 대해 더 읽을 수 있습니다 : Git- '가정하지 않은 가정'과 '건너 뛰기'의 차이점



이 작업을 수행 한 후 분기를 변경하려고하면 "다음 추적되지 않은 작업 트리 파일을 체크 아웃으로 덮어 씁니다. 분기를 전환하기 전에 이동하거나 제거하십시오"라는 메시지가 나타납니다. 어떤 아이디어를 피하는 방법?
Patrick Szalapski

@aexl 참조하는 문서로 이동 한 compiledsuccessfully.dev/git-skip-worktree
앤드류 Keeton

1
문서는 이 나쁜 생각이라고. "사용자는 종종 Git에게 추적 된 파일의 변경 사항을 무시하도록 지시하기 위해 변경되지 않은 스킵 워크 스킵 비트를 사용하려고 시도합니다. Git이 특정 작업을 수행 할 때 인덱스에 대해 작업 트리 파일을 여전히 검사 할 수 있기 때문에 예상대로 작동하지 않습니다. 일반적으로 Git은 추적 된 파일의 변경 사항을 무시할 수있는 방법을 제공하지 않으므로 대체 솔루션이 권장됩니다. "
커티스 블랙웰

58

내 코드 점화기 프로젝트의 경우 데이터베이스에 database.php.exampleconfig.php.example 을 유지 합니다 .

그런 다음 config.phpapplications / config / database.php.gitignore 파일에 추가합니다.

따라서 마지막으로 배포 할 때 .example 파일 (config.php 및 database.php로)을 복사하고 사용자 정의 할 수 있으며 GIT에 의해 추적되지 않습니다.


12
좋은 해결책이지만 nasirkhan의 대답이 가장 좋습니다.
wordsforthewise

이것은 좋은 해결책이 아닙니다. 자식 인덱스를 플러시하면 원하지 않는 변경 사항을 추적하기 시작합니다. 이 작업을 수행하는 올바른 방법은 @nasirkhans 답변을 참조하십시오.
Brian Melton-Grace-MSFT

3
나는 이전의 두 의견에 동의하지 않습니다. 이 방법으로 "기본"값을 체크 아웃하지 않고 로컬 구성을 다른 곳에 복사하기 만하면 훨씬 쉽게 업데이트 할 수 있습니다. 또한 모든 리포지토리에 적용되므로 반복적 인 리포지셔닝을 수행 할 필요가 없습니다.
OskarD90

1
그것이 gitignore에 있다면 왜 변경을 다시 추적하기 시작
할까요

OP의 문제를 해결하지만 실제로 질문에 대답하지는 않습니다.
트래비스 윌슨

1

.gitignore파일에 넣고 필요에 따라 수동으로 복사합니다.

따라서 스켈레톤 파일 이름은 git에 있고 무시 파일 이름은 git에 있지 않지만 .gitignore에 있습니다. 이렇게하면 '템플릿'에서 '실제'로 복사하는 수동 단계 (아마도 스켈레톤보다 나은 이름)가 수행되면 즉시 무시됩니다.


1
먼저 repo에 추가 한 다음 .gitignore에 추가 할 수있는 방법이 없습니까? 파일을 포함시키는 솔루션이 있었지만 특정 커밋이나 무언가 후에 변경 사항이 없으면 좋을 것입니다.
gorelative

1
@mklauber 내가 실행할 때까지 무기한으로 유지하고 싶습니다 git rm <file>. 목적은 IE : config.php 파일입니다. 구성 파일을 유지하고 싶지만 클라이언트에서 클라이언트로 데이터베이스 자격 증명이 다르기 때문에 분명히 추적하고 싶지 않습니다.
gorelative

1
예, rails database.yml 파일에 문제가 있습니다. 우리는 골격을 유지 한 다음 복사하고 변경합니다.
Michael Durrant

이 "Skeleton"구성 파일을 만들면 초기 커밋에 추가 할 것입니다. 그런 다음 파일을 무시하도록 .gitignore를 수정 하시겠습니까? 실제로 파일을 repo에 보관하지만 골격으로 유지합니까?
gorelative

10
다음 두 가지 옵션이 있습니다. 파일을 추가 한 다음 파일 git add file1을 편집하십시오 .gitignore. 커밋 된 파일은 그대로 유지되며 업데이트되지 않습니다. 또는 : 파일을 .gitignore추가 한 다음 파일을 추가하여 파일을 git add --force file1강제로 삽입 할 수 있습니다. 파일을 덮어
써야

1

주어진 답변은 문제를 부분적으로 해결하지만 더 많은 문제가 발생합니다.

"Web.Local.config"파일을 보존해야했습니다. 나를 위해 일한 유일한 해결책은 다음과 같습니다.

1. 프로젝트에서 파일을 제외

2. 파일의 별도 사본을 Web.LocalTemplate.config로 작성하십시오.

"Web.LocalTemplate.config"가 Git에 의해 추적되었으므로 모든 개발자가이를 시작점으로 사용할 수 있습니다. 그러나 프로젝트의 일부가 아닌 "Web.Local.config"는 자동으로 무시됩니다.


git update-index --skip-worktree FILENAME문제를 부분적으로 해결하거나 문제를 더 추가 하는 방법은 무엇 입니까? 그것은 당신이하려는 일을 정확하게 해결합니다. 해봤 어?
아미르 아시 라프
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.