깃랩에 있는 Mini_WAS 저장소와 새롭게 연결하고 싶은 로컬 저장소를 연결하려고 한다.
새로 연결하고 싶은 원격 저장소명과 URL
git remote add "저장소명""url"
그런데!!
이전 글을 참고해서 git push origin master과 git push origin +master 둘 다 해봤는데 아래처럼 표시가 되었다.
$ git push origin master
To http://~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
! [rejected] master -> master (fetch first)
error: failed to push some refs to 'http://gitlab-intern.polloud.com/songij4/mini_was.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help'for details.
~~~~@~~~ MINGW64 ~/eclipse-workspace/Mini_WAS2 (master)
$ git push origin +master
Enumerating objects: 87, done.
Counting objects: 100% (87/87), done.
Delta compression using up to 4 threads
Compressing objects: 100% (77/77), done.
Writing objects: 100% (87/87), 38.01 KiB | 2.38 MiB/s, done.
Total 87 (delta 12), reused 0 (delta 0), pack-reused 0
remote: GitLab: You are not allowed to force push code to a protected branch on this project.
To http://gitlab-intern.polloud.com/songij4/mini_was.git
! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'http://gitlab-intern.polloud.com/songij4/mini_was.git'
원인
깃랩은 저장소를 생성하면 기본설정이 '관리자(Maintainers)'만 수정 가능하다.
'개발자(Developers)'는 푸시 허용이 돼 있지 않아서 나는 오류이다.
해결 방법
깃랩 레파지토리에서 > settings > Repository > Protected Branches > 선택하는 부분에 Developers + Maintainers 해주면 된다.
! [rejected] master -> master (fetch first)
error: failed to push some refs to 'http://gitlab-intern.polloud.com/songij4/mini_was.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
// 요청을 받는 역할 - 요청을 읽어서 request 객체에 정보를 넣음
Request request = new Request();
inputStream = socket.getInputStream();
bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
receiveRequest(request, bufferedReader);
System.out.println("오청받기 성공");
outputStream = socket.getOutputStream();
Response response = new Response(outputStream);
// 정적 파일인지 아닌지 구분
File file = getFile(request);
if (file.isFile()) {
sendResponse(file, response); // 정적파일이면 Response 응답을 보냄
} else {
new ContainerController(request, response).start(); // 동적파일이면 컨테이너 역할을 하는
}
1) 받은 HTTP Request 부분을 클래스 Request에 정보를 담는다.
앞에 Runnable 안에 있는 receiveRequest()메소드가 Request 객체 안에 요청받은 정보를 넣는 행동을 한다.
예) 개발 진행 중 현재 작업했던 내용을 서버에 반영하기 위해서 여러가지 테스트를 진행하면서 문제점은 없는지 체크하기 위함. main이 되는 작업과 test를 위한 작업을 분기.
branch 만들기
1. 브랜치 목록을 볼 때
git branch
2. 브랜치 생성할 때
git branch "새로운 브랜치 이름"
3. 브랜치 삭제할 때
git branch -d
4. 병합하지 않은 브랜치를 강제 삭제할 때
git branch -D
5. 브랜치를 전환(체크아웃)할 때
git checkout "전환하려는 브랜치 이름"
6. 브랜치를 생성하고 전환까지 할 때
git checkout -b "생성하고 전환할 브랜치 이름"
branch 정보 확인
1. 브랜치 간에 비교할 때
git log "비교할 브랜치 명 1".."비교할 브랜치 명 2"
2. 브랜치 간의 코드를 비교할 때
git diff "비교할 브랜치 명 1".."비교할 브랜치 명 2"
3. 로그에 모든 브랜치를 표시하고, 그래프로 표현하고, 브랜치 명을 표시하고, 한줄로 표시할 때
git log --branches --graph --decorate --oneline
branch 병합
1. A 브랜치로 B 브랜치를 병합할 때 (A ← B)
git checkout A
git merge B
2. 충돌이 일어났을 때
- 충돌이 생기면 "Auto-merging ..." 메시지가 뜸
- git status를 하면 충돌이 일어난 파일 찾을 수 있음
- 충돌 작업을 끝냈다는 것을 git에게 알려줌
git add 'conflicted file name'
stash
stash : 감추다, 숨겨두다의 뜻을 가지고 있음
"다른 브랜치로 checkout을 해야 하는데 아직 현재 브랜치에서 작업이 끝나지 않은 경우는 커밋을 하기가 애매합니다. 이런 경우 stash를 이용하면 작업중이던 파일을 임시로 저장해두고 현재 브랜치의 상태를 마지막 커밋의 상태로 초기화 할 수 있습니다. 그 후에 다른 브랜치로 이동하고 작업을 끝낸 후에 작업 중이던 브랜치로 복귀한 후에 이전에 작업하던 내용을 복원할 수 있습니다. "
1. 하던 작업을 저장하고 가장 최근 commit 상태로 만듦
git stash
2. 저장되어 있는 작업 중 가장 최근 stash를 가져옴
git stash apply
git stash pop //git stash apply + git stash drop
pop은 한번 불러오면 stash 목록에 저장한 시점이 삭제되어있고 apply는 해당 stash를 불러와도 list에 남아있음
1) 채팅할 때 화면에 나오는 나는 오른쪽, 친구는 왼쪽 정렬이 너무 어려웠다. 하아ㅏㅏㅏㅏ 이걸로 거의 일주일은 날린 것 같다.
처음에 JTextArea를 사용했다. 그런데 왼쪽, 오른쪽 정렬이 따로 되지 않는 것과 이미지는 불가능하다는 것.
그래서 구글링하다가 JTextPane을 발견했다. 이것을 사용하면 될 것 같은데 정보가 많이 없었다..ㅠㅅㅠ
일주일동안 삽질하다가 인턴 같이 하는 오빠가 메소드 하나하나씩 분석해가면서 성공시켰다.!!!!!!!!!!!!!!!!!!!!!!
덕분에 잘 적용할 수 있었다. 고마워요...
아 지금 이거 적다가 나머지 힘들었던 2가지가 기억나질 않는다. (큰일) 2가지만 적어야지..
2) 그룹채팅이 아니라 1대 1 채팅 만든 것.
이것저것 참고해가면서 채팅 프로그램을 만드는데 보통 다 그룹채팅 형식이었다. (서버쪽에서 연결된 모든 클라이언트를 저장하는데, 메시지를 받고 보낼 때 모든 클라이언트한테 전송함 - 조건을 주지 않으므로 더 간단함.) 그래서 처음 소켓 통신 성공시키고 대화하는데 웃겼다. 내 아이디로 로그인해서 A친구 채팅방에 글을 쓰고 전송 누르면, A친구한테만 전달되는 것이 아니라 열려 있는 모든 채팅방 친구들한테 다 전달이 된다.ㅋㅋㅋ
하지만 내 채팅은... 카톡처럼 친구 리스트(?)를 누르면 그 친구랑 대화하도록 GUI를 만들어서 그럴 수 없다구,,, 1:1 이어야 한다구.... 결론은 성공시켰지만 생각보다 간단하지 않았다. 채팅창의 정보도 저장하고 있어야하고 보내는 사람, 받는 사람 비교 도 필요하고! 아 그냥 직접 해봐야 알 수 있는 것..
코드 정리를 더 완벽하게 하고 싶은데 여기서 마무리하려고 한다.
시간을 길게 가진다고 되는 것이 아니라는 걸 너무 느꼈기 때문에...@!@!
나중에 폭풍성장하고 그때 다시 와서 보면 더 완벽하게 할 수 있지 않을까 싶다ㅎㅎㅎ
KEVotingTalk
자바 스윙을 이용한 소켓 채팅 프로그램
사용 기술 : JAVA
설명 : 1 대 1 채팅 KEVotingTalk입니다. GUI를 구현하기 위해 swing을 이용했고 서버와 클라이언트는 소켓 통신을 통해 연결됩니다. 마지막으로 회원관리를 위해 MySQL DB 사용했습니다.