요즘 프로젝트를 진행하면서 버전관리를 위해 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

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
interface ILogger
{
    void WriteLog(string log);
}
 
class ConsoleLogger : ILogger
{
    public void WriteLog(string message)
    {
        Console.WriteLine("{0} {1}", DateTime.Now.ToLocalTime(), message);
    }
}
 
ILogger logger = new ConsoleLogger();
logger.WriteLog("Hello, World!");
cs


인터페이스는 인스턴스를 못 만들지만, 참조는 만들 수 있다.

이 참조에 파생 클래스의 객체의 위치를 담을 수 있다.

PSW : Processor Status Word, 16비트 레지스터


범용 레지스터

r0 ~ r7


r5: 프레임 포인터, 환경 포인터

r6: 스택 포인터
r7: 프로그램 카운터


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
struct proc
{
    char p_stat;    // 상태, NULL인 경우 해당하는 PROC[]를 비었다고 판단
    char p_flag;    // 플래그
    char p_pri;        // 실행 우선순위, 값이 작을수록 우선순위가 높으며, 다음에 실행되기 쉬움
    char p_sig;        // 수신된 시그널
    char p_uid;        // 사용자 ID(정수형)
    char p_time;    // 메모리나스와프 영역에 머물렀던 시간(초)
    char p_cpu;        // CPU를 사용한 누적 시간(tick, 틱)
    char p_nice        // 실행 우선순위를 낮추기 위한 보정 값, 초기값은 0으로 nice 시스템 콜로 사용자가 값을 설정함
    int p_ttyp;        // 프로세스를 실행한 터미널
    int p_pid;        // 프로세스 ID
    int p_ppid        // 부모 프로세스 ID
    int p_addr;        // 할당받은 물리 메모리 어드레스(64바이트 단위)
    int p_size        // 할당받은 메모리 크기(64바이트 단위)
    int p_wchan;    // 슬립 상태가 된 이유
    int *p_textp;    // 사용 중인 텍스트 세그먼트
}proc[NPROC];
 
struct user
{
    int u_rsav[2];        // 프로세스가 바뀔 때, 실행 중인 r5, r6를 저장한 곳
    int u_fsav[25];        // PDP-11/40 환경에서는 사용하지 않음
    char u_segflg;        // 파일을 읽고 쓸 때 사용하는 플래그
    char u_error;        // 에러가 발생했을 때 에러코드를 저장함
    char u_uid;            // 실제로 파일을 실행하는 사용자 ID(effective user id)
    char u_gid;            // 실제로 파일을 실행하는 사용자 그룹 ID(effective group id)
    char u_ruid;        // 실행될 때 사용자 ID(real user id)
    char u_rgid;        // 실행될 때 그룹 ID(real group id)
    int u_procp;        // 이 user 구조체에 대응된 proc[] 엔트리를 가리킴
    char *u_base;        // 파일을 읽고 쓸 때 매개변수를 넘겨 줄 때 사용함
    char *u_count;        // 파일을 읽고 쓸 때 매개변수를 넘겨 줄 때 사용함
    char *u_offset[2];    // 파일을 읽고 쓸 때 매개변수를 넘겨 줄 때 사용함
    int *u_cdir;            // 현재 디렉터리의 inode[] 엔트리
    char u_dbuf[DIRSIZ];// namei()가 사용하는 작업영역, 파일, 디렉터리명 등을 저장함
    char *u_dirp;        // 사용자 프로그램, 혹은 커널 프로그램에서 가리키는 파일의 경로를 읽을 때 사용함
    struct {        
        int u_ino;        // u_ino는 inode 번호, u_name은 파일이나, 디렉터리를 나타냄
        char u_name[DIRSIZ];
    }u_dent;            // namei()가 사용된 작업 영역, 디렉터리 엔트리가 저장됨
    int *u_pdir;            // namei()에 대상되는 파일, 디렉터리의 부모 디렉터리를 저장함
    int u_uisa[16];        // 사용자 PAR의 값
    int u_uisd[16];        // 사용자 PDR의 값
    int u_ofile[NOFILE};    // 이 프로세스가 오픈한 파일
    int u_arg[5];        // 사용자 프로그램에서 시스템 콜로 매개변수를 전달할 때 사용함
    int u_tsize;        // 텍스트 세그먼트 크기(64바이트 단위)
    int u_dsize;        // 데이터 영역 크기(64바이트 단위)
    int u_ssize;        // 스택 영역 크기(64바이트 단위)
    int u_sep;            // PDP-11/40 환경에서는 기본값이 0
    int u_qsav[2];        // 시스템 콜을 처리 중에 시그널 처리가 발생했을 때 사용함. r5, r6를 저장하는 곳
    int u_ssav[2];        // 스와프 아웃 처리로 user.u_rsavp[]값이 부정되었을 때 사용함. r5, r6를 저장하는 곳
    int u_signal[NSIG];    // 시그널을 수신했을 때 동작 설정을 위해서 사용함
    int u_utime;        // 사용자 모드로 CPU를 사용한 시간(tick)
    int u_stime;        // 커널 모드로 CPU를 사용한 시간(tick)
    int u_cutime[2];        // 자식 프로세스가 사용자 모드로 사용한 시간(tick)
    int u_cstime[2];        // 자식 프로세스가 커널 모드로 사용한 CPU 시간(tick)
    int *u_ar0;            // 시스템 콜 처리 시 사용자 프로세스의 범용레지스터나 PSW 조작을 할 떄 사용함
    int u_prof[4];        // 프로파일용, 이 책에서는 다루지 않음
    char u_intflg;        // 시스템 콜 처리 중에 시그널 처리가 발생했는지 판단하는 플래그
}u;
cs


+ Recent posts