편집하다

편집하다

일부 make 파일 및 에뮬레이터 등을 실행한 후 소스 코드 파일(*.cc)은 여전히 ​​동일한 파일임에도 불구하고 "깨진 링크"로 읽혀집니다. (*.cc) 파일은 내 git 저장소에서 왔으며 거기와 다른 컴퓨터에서는 (*.cc) 파일이 소스 코드 파일로 올바르게 읽혀지기 때문에 이것이 올바른 파일이라는 것을 알고 있습니다. 또한 git 명령을 통해 git status파일이 변경되지 않았음을 확인할 수 있습니다 . 그렇다면 유일한 결론은 Linux 파일 시스템 속성이 손상되었다는 것입니다.

이러한 오류를 수정하는 방법은 무엇입니까?

다음은 파일에서 실행할 몇 가지 명령입니다.

$chmod 777 producer_consumer.cc 
chmod: cannot operate on dangling symlink ‘producer_consumer.cc’

$lsattr producer_consumer.cc 
lsattr: Operation not supported While reading flags on producer_consumer.cc

$readlink producer_consumer.cc
// EPOS Synchronizer Abstraction Test Program

#include <utility/ostream.h>
#include <thread.h>
#include <semaphore.h>
#include <alarm.h>

using namespace EPOS;

const int iterations = 100;

OStream cout;

const int BUF_SIZE = 16;
char buffer[BUF_SIZE];
Semaphore empty(BUF_SIZE);
Semaphore full(0);

int consumer()
{
    int out = 0;
    for(int i = 0; i < iterations; i++) {
        full.p();
        cout << "C<-" << buffer[out] << "\t";
        out = (out + 1) % BUF_SIZE;
        Alarm::delay(5000);
        empty.v();
    }

    return 0;
}

int main()
{
    Thread * cons = new Thread(&consumer);

    // producer
    int in = 0;
    for(int i = 0; i < iterations; i++) {
        empty.p();
        Alarm::delay(5000);
        buffer[in] = 'a' + in;
        cout << "P->" << buffer[in] << "\t";
        in = (in + 1) % BUF_SIZE;
        full.v();
    }

    cons->join();

    cout << "The end!" << endl;

    delete cons;

    return 0;
}

내 리눅스는 다음과 같습니다 Linux Mint 17.3 XCFE - 3.19.0-32-generic #37~14.04.1-Ubuntu SMP Thu Oct 22 09:37:25 UTC 2015 i686 i686 i686 GNU/Linux

다음은 노틸러스 파일 관리자의 파일 속성에 대한 이미지입니다.

https://i.stack.imgur.com/FyD9g.png

편집하다

I have no idea how you ended up with this.

그냥 저번처럼 어떻게 하는지 알아내고, 고치고 나서 다시 했어요. 저는 GUI git 도구인 Smartgit을 사용하고 있으며 파일 시스템에서 파일을 삭제할 때마다 Smartgit 인터페이스로 이동하여 클릭하여 상태를 재설정(즉, 삭제 취소)할 때마다 아래와 같은 미친 파일 링크가 표시됩니다. 그런데 이상한 점은 git status콘솔을 통해 표시해도 파일이 변경되지 않고 원격 git 저장소에 있는 파일과 정확히 동일하다는 것입니다.

또한 명령줄을 통해 다음을 수행하는 경우 Smartgit에만 해당되는 것이 아닙니다. git checkout HEAD -- philosophers_dinner.cc

파일을 삭제하면 미친 링크처럼 다시 살아납니다. 이제 다음 두 명령으로 하루 종일 Linux를 사용할 수 있습니다.

# firstly we delete the file
rm philosophers_dinner.cc

# this command will break the file
git checkout HEAD -- philosophers_dinner.cc

# these command will fix the break file by git reset
readlink philosophers_dinner.cc > philosophers_dinner.cc.new
mv philosophers_dinner.cc{.new,}

처음에는 오래된 Git일지도 모른다고 생각했습니다(1.9.3을 사용하고 있습니다). 그런 다음 2.9.3으로 업데이트하고 여전히 이 작업을 수행합니다. 내 리눅스가 너무 오래되어서 18.0이 아닌 Mint 17.3일 수도 있지만 설치했을 때 대부분의 작업이 17.3에서처럼 작동하지 않았다가 다시 돌아갔습니다.

답변1

제일 흥미로운!

귀하의 producer_consumer.cc파일은 심볼릭 링크입니다. 하지만 이것은 오래된 심볼릭 링크가 아닙니다. 이는 완전히 미친 목표에 대한 상징적 링크입니다. 이는 링크 대상이 C++ 프로그램의 전체 소스 코드인 매우 긴 파일 이름이기 때문입니다. 물론, 이 심볼릭 링크는 매달려 있는 심볼릭 링크입니다. 노틸러스에서 볼 수 있는 동작은 head이러한 심볼릭 링크에서 예상되는 것과 정확히 같습니다.

귀하는 어떤 형태로든 "부패"가 존재한다는 결론을 입증할 증거를 제공하지 않았습니다. 비록 이상하긴 하지만 이것은 완벽하게 허용되는 심볼릭 링크입니다. 다양한 일반 도구를 사용하여 이러한 기호 링크를 만드는 방법에는 여러 가지가 있습니다. 예를 들어, 다음은 쉘 대체를 사용한 초보자 연습입니다.

당신이 어떻게 이 기괴한 혼란에 빠지게 되었는지는 당신만이 알고 있을 뿐, 우리에게는 공개하지 않았습니다. 그것을 제거하는 방법은 매우 쉽습니다. 다음은 두 가지 명령입니다. 그 중 하나는 주로 실행했습니다.

linkProducer_consumer.cc > Producer_consumer.cc.new 읽기
mv Producer_consumer.cc{.new,}

마찬가지로, 앞으로 어떻게 다시 문제가 발생하지 않도록 방지하는 방법은 단지 막연하게 "아, 내가 뭔가를 했어"가 아니라 World Zero의 구체적인 정보를 제공했기 때문에 자신만이 알 수 있는 것입니다. 아마도 어느 시점에서 어떤 작업을 수행하는 makefile을 실행했을 것입니다. 이 기호 링크의 존재에 영향을 미칠 수도 있고 그렇지 않을 수도 있습니다.

따라서 이 두 명령을 다시 실행할 수 있습니다.

답변2

파일이 깨진 링크이기 때문에 깨진 링크로 표시됩니다. C++ 코드처럼 보이는 것을 대상으로 하는 링크입니다. 일반적으로 링크의 대상은 파일 경로처럼 보이지만 시스템에 관한 한 그것은 단지 일부 텍스트일 뿐입니다.

아니요, 어떻게 이런 결과가 나왔는지 모르겠습니다. 어쩌면 어딘가에 잘못된 복사-붙여넣기가 있었을 수도 있습니다. 명령을 실행했거나 ln -s '// EPOS Synchronizer …}' producer_consumer.cc동등한 작업을 수행했습니다. makefile 명령 ln -s '$(shell cat $<)' $<이나 그에 상응하는 명령을 실행할 수도 있습니다.

현재 콘텐츠를 유지하려면 다음 명령을 사용하여 콘텐츠를 추출하여 readlink파일에 저장하세요.

mv producer_consumer.cc bad-link
readlink bad-link >producer_consumer.cc
rm bad-link

Git 저장소에 심볼릭 링크를 저장한 것 같습니다. Git은 심볼릭 링크를 저장할 수 있지만 심볼릭 링크가 없는 시스템에서 이를 확인하면 일반 파일을 얻게 됩니다. Linux 작업 복사본에 일반 파일이 있으면 이를 git에 커밋합니다.

git -m 'Changed symlink back to regular file' producer_consumer.cc

이전 버전을 보면 여전히 심볼릭 링크가 있습니다. git log producer_consumer.cc심볼릭 링크가 언제 체크인되었는지 알려주겠지만, 이유를 설명하는 데는 도움이 되지 않을 것입니다.

답변3

해결책은 파일의 버전이 관리되므로 먼저 파일을 삭제하고 삭제를 제출하는 것입니다. 둘째, 새 파일을 생성하고 복제하는 대신 버전 시스템에서 올바른 내용을 복사합니다. 예를 들어 GitHub에서 허용하는 경우 웹 브라우저를 통해 커밋합니다.

버전 제어 시스템에서 해당 항목이 제거됩니다. 이는 git status명령이 소스 코드 파일과 기호 링크를 구별할 수 없기 때문입니다. 문제를 해결하기만 하면 git status명령은 그 사이에 무엇이 있는지 표시하지 않습니다. 따라서 먼저 삭제 사항을 커밋한 다음 다른 커밋에서 추가 사항을 수정해야 합니다.

관련 정보