[비망록] iCloud의 디렉토리를 git 관리하면 아픈 눈에 띄는 이야기

절대로 iCloud에서 코드를 관리하지 마십시오! ! !



iCloud의 디렉토리를 git 관리하면 다음과 같이 버전 파일이 제대로 작성 될 수 있습니다. 이것은 iCloud에서 작업하여 발생하므로 iCloud에서 작업하지 마십시오.



이 문제를 해결하는 방법



이미 버전 파일이 생성되었음을 알지 못하고 커밋 한 경우 버전 파일을 git 관리 대상에서 제거해야합니다. 그런 다음 버전 파일도 지 웁니다.

절차


  • iCloud에서 로컬 환경으로 작업 디렉토리를 이동합니다.
  • 로컬로 이동 한 작업 디렉토리에서 버전 파일을 관리 대상에서 지우고 존재 자체도 지 웁니다.
  • 커밋하고 푸시

  • 버전 파일 삭제 정보



    인덱스에 캐시 된 (관리 대상) 파일 목록은 다음과 같이 얻을 수 있습니다. 이 안에 버전 파일이 들어 있는지 확인하십시오.
    git ls-files
    

    위의 명령으로 출력 된 파일은 일단 파일 출력됩니다. 예를 들면 다음과 같습니다.
    git ls-files > ls-files.txt
    

    출력 된 파일 중에서 버전 파일을 추출하고 버전 파일과 원본 파일의 내용이 같으면 버전 파일을 놓칠 수 있습니다. 내용이 다른 경우에만 내용을 확인하고 지워야 할지 그렇지 않은지를 확인할 필요가 있다.
    따라서 지울 수있는 파일 목록을 얻는 프로그램을 만듭니다. 예를 들면 다음과 같습니다.
    (버전 파일은 사이에 스페이스가 있기 때문에 조금 번거롭다. 파일 출력할 때에, 1개의 파일로서 표현하기 위해서 쿼팅할 필요가 있다.)

    grouping.py
    
    import re
    from typing import Optional, Tuple
    import filecmp
    
    with open("ls-files.txt") as f:
        files = f.readlines()
    
    pattern = r"(^.+)(\s[0-9]+)(.*$)"
    pattern = re.compile(pattern)
    
    def split_file_name(filename: str) -> Optional[Tuple[str, str, str]]:
        m = pattern.match(filename)
        if m is None:
            return None
        prefix, version, suffix = m.groups()
        return prefix, version, suffix
    
    splited = [split_file_name(file) for file in files]
    
    versioned = list(filter(lambda s: s is not None, splited))
    
    versioned_dict = {}
    for file in versioned:
        key = (file[0],file[2])
        if key not in versioned_dict:
            versioned_dict[key] = []
        versioned_dict[key].append(file)
    
    # rm_files(消しても良いファイル達), save_dict(中身を確認するファイル達)の作成
    rm_files = []
    save_dict = {}
    
    keys = versioned_dict.keys()
    for key in keys:
        ori_file = "".join(key)
        for sp in versioned_dict[key]:
            ver_file = "".join(sp)
    
            # ファイルの比較
            if filecmp.cmp(ori_file, ver_file):
                rm_files.append(ver_file)
            else:
                if key not in save_dict:
                    save_dict[key] = []
                save_dict[key].append(ver_file)
    
    # 消しても良いファイル一覧をテキストファイルとして出力
    with open("rm.txt", "w") as f:
        for file in rm_files:
            f.write('\"{}\"'.format(file) + " ")
    

    위와 같은 프로그램으로 지울 수있는 파일 목록을 얻을 수 있으면 파일을 git 관리 대상에서 제거하고 존재 자체도 삭제합니다. 다음과 같이.
    eval git rm $(cat rm.txt)
    

    쉘 해석의 순서로 인해 eval이 필요합니다.

    좋은 웹페이지 즐겨찾기