요즘 프로젝트를 진행하면서 버전관리를 위해 Git을 사용중이다.

보통 프로젝트에는 소스코드와 IDE에서 프로젝트를 불러오기 위한 프로젝트 설정 파일들이 포함된다.

 

일단 프로젝트 설정 파일들(이하 프로젝트파일)과 소스코드를 커밋하여 원격저장소에 푸시하고,

그 이후부터 프로젝트파일들은 파일내용이 변해도 무시하기 위해 .gitignore에 등록하였다.

(프로젝트파일들은 컴파일을 하거나, 단순히 IDE에서 불러오거나, 디버깅설정들을 변경하기만 해도 다 변경된다.)

 

하지만 이후에 프로젝트파일들이 변경될 때마다 git status에는 modifed 되었다고 출력되는 것이다.

나는 분명히 .gitignore에 추가했는데 말이다.

그래서 코드 변경내용을 한번에 git add * 하고 싶은데, 프로젝트파일들이 자꾸 변경내역에 떠서 귀찮게 하는 것이다.

구글링 해보니 이미 커밋한 파일들은 tracking되기 때문에 .gitignore에 추가해도 계속 tracking된다고 한다.

 

따라서 .gitignore에 추가할 파일들은 애초에 원격저장소에 올리지 않을 파일들만 추가하거나,

앞으로 변경되지 않을 파일들만 추가하는게 편하겠다.

 

일단 프로젝트 파일들을 변경내역에 안뜨게 하기 위해 어떤 방법들이 있을까 생각해보았다.

 

첫번째로는 아예 저장소에 올리지 않는 것이다. 하지만 이경우의 문제점은 다른 팀원들이 Git에서 코드만 받을 수 있지 프로젝트 파일들은 나에게 또 요청할 것이다. 굉장히 귀찮을 것 같다.

 

두번째로는 저장소에 프로젝트파일을 압축하여 올려 받을사람은 받고, 실제 내가 사용하는 프로젝트파일은 로컬에서 따로 관리한다. 그럴 듯 한 방법이지만 뭔가 깔끔하지는 않다.

 

그래서 구글링을하여 다른 방법이 없을까 찾아보았다.

 

1. 첫번째 솔루션

git rm -r --cached . 
git add .
git commit -am "Remove ignored files"

 

이 방법을 해보니 아예 .gitignore에 등록된 파일중 tracking중인 파일들을 로컬에서는 놔두고 원격저장소에서는 삭제한다. 커밋하고 푸시하면 원격저장소에서 삭제된다. 내가 원하는 방법이 아니었다. 원격저장소에는 그래도 남아있어야 한다.

 

 

 

2. 두번째 솔루션

git update-index --assume-unchanged [path] (해제하려면 git update-index --no-assume-unchanged [path])

ex) git update-index --assume-unchanged Project/*

 

이 방법으로 해보니까 잘 되는 것 같다. 해당 경로에 파일들을 수정해도 수정내역에 뜨지 않는다.

하지만 단점은 로컬에서만 적용된다. 새로 clone한 저장소에서는 적용되지 않는다. 저 커맨드를 다시 입력해줘야 한다.

내가 원하는 것은 아예 원격저장소에서 clone했을 때 프로젝트파일들이 복사는 되지만 수정해도 수정내역에 안 떴으면 좋겠다.

 

그리고 또 하나, git reset --hard를 했을 경우 수정한 파일들의 수정내역이 날라가는 것 같다.

 

 

 

3. 세번째 솔루션

git update-index --skip-worktree [path] (해제하려면 git update-index --no-skip-worktree [path])

ex) git update-index --skip-worktree Project/*

 

이 방법도 두번째와 마찮가지로 잘 되는 것 같다. 아마도 두번째와 같이 로컬에만 적용될 것 같다.

문제는 이 방법으로 Project의 내용을 수정한 뒤 git reset --hard를 하면 fatal error가 발생한다.

 

git update-index --no-skip-worktree [path] 으로 다시 해제한 뒤 reset을 하면 잘 되는 것 같다.

 

일단은 여기까지 찾아봤는데 다른 방법이 더 있을 수도 있다.

어제 밤에 구글링하다가 sub module을 사용하는 방법이 있다고 스택오버플로우에서 본 것 같은데 어려워서 그냥 넘겼다....

 

 

참고한 스택오버플로우 페이지

https://stackoverflow.com/questions/1274057/how-to-make-git-forget-about-a-file-that-was-tracked-but-is-now-in-gitignore

 

How to make Git "forget" about a file that was tracked but is now in .gitignore?

There is a file that was being tracked by git, but now the file is on the .gitignore list. However, that file keeps showing up in git status after it's edited. How do you force git to completely f...

stackoverflow.com

https://stackoverflow.com/questions/13630849/git-difference-between-assume-unchanged-and-skip-worktree/13631525#13631525

 

Git - Difference Between 'assume-unchanged' and 'skip-worktree'

I have local changes to a file that I don't want to commit to my repository. It is a configuration file for building the application on a server, but I want to build locally with different settings.

stackoverflow.com

https://stackoverflow.com/questions/936249/how-to-stop-tracking-and-ignore-changes-to-a-file-in-git

 

How to stop tracking and ignore changes to a file in Git?

I have cloned a project that includes some .csproj files. I don't need/like my local csproj files being tracked by Git (or being brought up when creating a patch), but clearly they are needed in the

stackoverflow.com

 

+ Recent posts