# การใช้ร่วมกันระหว่างบัญชี

> ccam share ลิงก์การตั้งค่า, CLAUDE.md, ส่วนขยาย และประวัติเข้ากับโฟลเดอร์ของกลุ่มอย่างไร พร้อมแผน การสำรอง และตัวเลือกเมื่อขัดแย้งกัน และ off คัดลอกกลับอย่างไร

Source: https://ccam.dev/th/features/share/ · Updated 2026-10-19

แต่ละบัญชีมีโฟลเดอร์ของตัวเอง แต่สิ่งที่อยู่ข้างในส่วนใหญ่ไม่จำเป็นต้องแยกกัน `ccam share` เปิดหรือปิดการใช้ร่วมกันทีละบัญชีและทีละรายการ: ไฟล์หรือโฟลเดอร์ของบัญชีจะถูกย้ายเข้าไปในโฟลเดอร์ของกลุ่มและแทนที่ด้วยลิงก์สัญลักษณ์ ทุกบัญชีในกลุ่มจึงอ่านและเขียนสำเนาเดียวกัน ใช้คำสั่งนี้หลัง `ccam add` เพื่อเปลี่ยนสิ่งที่บัญชีใช้ร่วมกัน หรือเพื่อจัดบางบัญชีไว้ในกลุ่มของตัวเอง

## การใช้งาน

```sh
ccam share work                       # show what work shares, and with which group
ccam share work --history on          # share conversation history with the default group
ccam share side --history team        # share it with the group team instead
ccam share work --settings off        # give work its own copy of settings.json again
ccam share work --memory off --fresh  # stop sharing CLAUDE.md and start with no file
ccam share work --settings on --yes --prefer merge   # no questions; merge JSON on conflicts
ccam --dry-run share work --history on               # print the plan, change nothing
```

หากไม่ใส่ตัวเลือกของรายการ `ccam share` จะพิมพ์สถานะปัจจุบัน:

```console
$ ccam share work
Sharing for work
  MCP servers                        shared (group default)  --mcp
  settings.json                      shared (group default)  --settings
  global CLAUDE.md                   shared (group default)  --memory
  agents, commands, skills, plugins  shared (group default)  --extensions
  conversation history               local                   --history
```

เมื่อใส่ตัวเลือก ccam จะพิมพ์แผน ถามเกี่ยวกับแต่ละไฟล์ที่ต่างจากสำเนาของกลุ่ม และถาม `Proceed? [y/N]` ก่อนเปลี่ยนแปลงสิ่งใด บัญชีใหม่จะใช้ทุกอย่างร่วมกันยกเว้นประวัติการสนทนา [ใช้เซิร์ฟเวอร์ MCP การตั้งค่า และประวัติร่วมกัน](https://ccam.dev/th/docs/sharing.md) อธิบายแต่ละรายการจากมุมของผู้ใช้

## ตัวเลือก

| ตัวเลือก | สิ่งที่ทำ | ค่าเริ่มต้น |
| --- | --- | --- |
| `--mcp <on\|off\|group>` | เซิร์ฟเวอร์ MCP | ไม่เปลี่ยน |
| `--settings <on\|off\|group>` | `settings.json` | ไม่เปลี่ยน |
| `--memory <on\|off\|group>` | `CLAUDE.md` ระดับ global | ไม่เปลี่ยน |
| `--extensions <on\|off\|group>` | `agents/`, `commands/`, `skills/`, `plugins/`, `output-styles/`, `rules/` | ไม่เปลี่ยน |
| `--history <on\|off\|group>` | `projects/` และ `history.jsonl` | ไม่เปลี่ยน |
| `--fresh` | เมื่อปิดการใช้ร่วมกัน ให้เริ่มแบบว่างเปล่าแทนการคัดลอกเนื้อหาของกลุ่ม | ปิด |
| `--prefer <group\|mine\|merge>` | วิธีตัดสินเมื่อขัดแย้งกัน | ถาม เมื่อใช้ `--yes` จะใช้ค่าเริ่มต้นของแต่ละรายการ |
| `-y`, `--yes` | ทำงานโดยไม่ถาม ความขัดแย้งจะเป็นไปตาม `--prefer` | ปิด |
| `-h`, `--help` | ความช่วยเหลือของ `share` | |
| `--dry-run` (global) | รองรับ: ถามเรื่องความขัดแย้ง พิมพ์แผน และไม่เปลี่ยนแปลงสิ่งใด | ปิด |

ค่า `on` หมายถึงกลุ่ม `default` ส่วน `off` หมายถึงเก็บไว้เฉพาะบัญชี (ไม่ใช้ร่วมกัน) และค่าอื่นใดคือชื่อกลุ่ม ชื่อกลุ่มจะกลายเป็นชื่อโฟลเดอร์ภายใต้ `~/.local/share/ccam/groups/` ดังนั้น `ccam share side --history ../x` จะล้มเหลวด้วย `invalid group name: "../x"` ระบุบัญชีได้ด้วยชื่อหรือหมายเลข และจะเปลี่ยนเฉพาะรายการที่คุณระบุ

## วิธีการทำงาน

ไฟล์ที่เกี่ยวข้อง:

- `~/.config/ccam/config.toml`: ตาราง `[profile.share]` ของแต่ละบัญชี ซึ่งมีค่าหนึ่งค่าต่อรายการ
- `~/.local/share/ccam/profiles/<name>/`: `CLAUDE_CONFIG_DIR` ของบัญชี
- `~/.local/share/ccam/groups/<group>/`: สำเนาที่ใช้ร่วมกัน

1. `internal/cli/share.go` อ่านการตั้งค่า นำค่าของแต่ละ `--<item>` ไปใช้กับสำเนาของการตั้งค่าบัญชีด้วย `config.Share.Set` และปฏิเสธหากบัญชีกำลังทำงาน
2. `share.Build` เปรียบเทียบการตั้งค่าปัจจุบันกับเป้าหมายแล้วระบุขั้นตอน โดยอ่านดิสก์อย่างเดียว: `os.Lstat` และ `os.Readlink` สำหรับทุกพาธใน `share.Layout` แผนคือรายการของการดำเนินการ ได้แก่ ย้ายเข้าไปในตำแหน่งที่ว่างของกลุ่ม (adopt) ย้ายไฟล์ที่กลุ่มยังไม่มี (merge dir) เขียนความขัดแย้งที่ตัดสินแล้วลงในกลุ่ม สำรอง ยกเลิกลิงก์ ลิงก์ คัดลอกกลับ เขียนพาธปลั๊กอินใหม่ และรวมรีจิสทรีปลั๊กอิน
3. ความขัดแย้งจะถูกตัดสินผ่านพรอมต์หรือด้วย `--prefer`
4. `Plan.Describe` พิมพ์แผน แล้ว ccam จะถาม
5. การตั้งค่าเป้าหมายจะถูกเขียนลงใน `config.toml` ก่อนที่จะย้ายสิ่งใด หาก `Plan.Apply` หยุดกลางคัน `ccam doctor --fix` และการรันซ้ำจะสร้างแผนไปสู่เป้าหมายที่บันทึกไว้และทำการเปลี่ยนแปลงให้เสร็จ
6. `Plan.Apply` รันขั้นตอนตามลำดับ ทุกขั้นตอนจะย้ายข้อมูลเข้าไปในกลุ่มหรือโฟลเดอร์สำรอง ไม่มีสิ่งใดถูกลบทิ้ง

`share.Layout` คือรายการที่อนุญาตของพาธที่แต่ละรายการครอบคลุม สิ่งที่ไม่อยู่ในรายการนี้ไม่มีทางไปถึงกลุ่มได้ `share.Never` ระบุ `.credentials.json` และ `.claude.json` และ `Build` จะหยุดพร้อมข้อผิดพลาดภายในหากไฟล์ใดไฟล์หนึ่งปรากฏในโครงสร้าง รายการ `mcp` ไม่มีพาธ: รายการเซิร์ฟเวอร์อยู่ภายใน `.claude.json` ดังนั้น[การใช้ MCP ร่วมกัน](https://ccam.dev/th/features/mcp.md)จึงทำงานผ่าน `mcp.json` ของกลุ่มแทน และ `--mcp` จะเปลี่ยนเพียงการตั้งค่าเท่านั้น

นี่คือสิ่งที่เกิดขึ้นกับโฟลเดอร์หนึ่งโฟลเดอร์ `projects/` เมื่อ `side` เปิดการใช้ประวัติร่วมกันและกลุ่มมีเนื้อหาอยู่แล้ว:

หากกลุ่มยังไม่มีสิ่งใดในพาธนั้น บัญชีนี้จะเป็นบัญชีแรกที่ใช้ร่วมกัน และโฟลเดอร์ของบัญชีจะถูกย้ายไปที่นั่นตามเดิมโดยไม่มีการสำรอง ในกรณีอื่น `mergeDir` จะย้ายแต่ละไฟล์ที่กลุ่มยังไม่มีเข้าไปในกลุ่ม ส่วนไฟล์ที่มีอยู่ทั้งสองฝั่งจะยังคงอยู่ในโฟลเดอร์ของบัญชี เวอร์ชันของกลุ่มจึงถูกเก็บไว้ จากนั้นโฟลเดอร์ของบัญชีจะไปอยู่ที่ `.ccam-backup/<time>/` ภายในโฟลเดอร์ของบัญชี และ `os.Symlink` จะวางลิงก์ไว้แทนที่ ไฟล์การสนทนาตั้งชื่อตาม session ID ประวัติจากหลายบัญชีจึงรวมกันได้โดยไม่ขัดแย้งกัน

การย้ายใช้ `rename(2)` และหันไปใช้การคัดลอกแล้วลบเมื่อข้ามระบบไฟล์ ลิงก์แบบสัมพัทธ์ภายในโครงสร้างที่ถูกย้ายซึ่งชี้ออกไปนอกโครงสร้างจะถูกเขียนใหม่เป็นลิงก์แบบสัมบูรณ์ (`fsutil.PortableLink`) จึงยังชี้ไปถูกที่จากตำแหน่งใหม่ รีจิสทรีของ `plugins/` (`installed_plugins.json`, `known_marketplaces.json`) เก็บพาธแบบสัมบูรณ์ที่ผ่านโฟลเดอร์ของบัญชี ccam จะเปลี่ยนให้ชี้ไปที่โฟลเดอร์ของกลุ่ม และเมื่อกลุ่มมีรีจิสทรีอยู่แล้ว จะรวมรายการของบัญชีเข้าไปในรีจิสทรีนั้น

การปิดรายการจะย้อนลิงก์กลับ:

ccam จะลบลิงก์เฉพาะเมื่อลิงก์ชี้เข้าไปในโฟลเดอร์ groups จากนั้นคัดลอกเนื้อหาปัจจุบันของกลุ่มเข้าไปในบัญชีด้วย `CopyTree` เมื่อใช้ `--fresh` จะข้ามการคัดลอก และบัญชีจะเริ่มโดยไม่มีสิ่งใดในพาธนั้น กลุ่มยังคงเก็บเนื้อหาไว้สำหรับบัญชีอื่น การย้ายรายการจากกลุ่มหนึ่งไปอีกกลุ่มหนึ่งจะยกเลิกลิงก์เดิมและลิงก์ไปยังกลุ่มใหม่ โดยไม่แตะกลุ่มเดิม แผนจะแจ้งไว้ในบรรทัด `Note:`

ไฟล์เดียวที่มีอยู่ทั้งสองฝั่งแต่เนื้อหาต่างกันถือเป็นความขัดแย้ง:

`share.NewConflict` แสดงตัวเลือกที่เหมาะกับไฟล์นั้น `history.jsonl` มีตัวเลือก `merge by line`, `keep group` และ `use mine` โดยการรวมมาเป็นอันดับแรก ไฟล์ `.json` อื่น ๆ มีตัวเลือก `keep group`, `use mine` และ `merge JSON` ส่วนไฟล์อื่นมีตัวเลือก `keep group` และ `use mine` ตัวเลือกแรกคือค่าเริ่มต้น:

```console
history.jsonl differs from the group's copy.
  mine:  ~/.local/share/ccam/profiles/side/history.jsonl
  group: ~/.local/share/ccam/groups/default/history.jsonl
  1) merge by line
  2) keep group
  3) use mine
Choice [1]:
```

`merge JSON` (`MergeJSONBytes`) รวมออบเจ็กต์แบบเรียกซ้ำ ต่ออาร์เรย์โดยไม่ให้มีค่าซ้ำ และเก็บค่าของกลุ่มไว้เมื่อทั้งสองฝั่งตั้งคีย์เดียวกันต่างกัน บัญชีอื่นจึงไม่เห็นพฤติกรรมที่เปลี่ยนไป `merge by line` เก็บบรรทัดของกลุ่มไว้ แล้วเพิ่มบรรทัดของคุณที่กลุ่มยังไม่มี ทุกตัวเลือกยกเว้น `keep group` จะบันทึกสำเนาของกลุ่มไว้ที่ `.ccam-backup/<time>/group/` ในโฟลเดอร์ของบัญชีก่อน แล้วจึงเขียนผลลัพธ์ด้วย `fsutil.AtomicWrite` ไฟล์ของคุณเองจะไปอยู่ในที่สำรองเสมอ

`--prefer group`, `mine` หรือ `merge` จะตัดสินทุกความขัดแย้งโดยไม่ถาม `merge` หมายถึง `merge JSON` หรือ `merge by line` แล้วแต่ว่าไฟล์นั้นมีตัวเลือกใด และไฟล์ที่ไม่มีทั้งสองตัวเลือกจะใช้ค่าเริ่มต้น ส่วน `--yes` อย่างเดียวจะใช้ค่าเริ่มต้นของแต่ละไฟล์

ทุกครั้งที่เริ่ม `share.Check` จะเปรียบเทียบแต่ละพาธในโครงสร้างกับการตั้งค่าโดยใช้เพียง `lstat` และ `readlink` ซึ่งเบาพอสำหรับเส้นทางการเริ่ม ลิงก์ที่หายไปจะถูกสร้างทันที เพราะไม่มีอะไรจะสูญหาย ไฟล์จริงในตำแหน่งที่ควรเป็นลิงก์ ลิงก์ที่ชี้ผิดที่ หรือลิงก์ที่ค้างอยู่จะหยุดการเริ่ม:

```console
ccam: stopped because of share link problems:
  ~/.local/share/ccam/profiles/work/CLAUDE.md: set to shared but is a real file, not a link
Repair them with `ccam doctor --fix`, then run again
```

`ccam doctor --fix` รัน `share.Build` โดยใช้การตั้งค่าที่บันทึกไว้ทั้งสองฝั่ง ซึ่งสร้างทุกขั้นตอนจากสิ่งที่อยู่บนดิสก์ เก็บเนื้อหาของกลุ่มไว้เมื่อขัดแย้งกัน และสำรองทุกสิ่งที่แทนที่

## ความปลอดภัยและกรณีพิเศษ

- **บัญชีที่กำลังทำงาน** ccam จะไม่เปลี่ยนการใช้ร่วมกันในขณะที่ Claude Code กำลังทำงานด้วยบัญชีนั้น (`account work is running; quit it first, then change its sharing`) เพราะเซสชันยังคงเขียนลงไฟล์ที่กำลังถูกย้าย และบรรทัดที่เพิ่มในระหว่างนั้นจะสูญหาย `--dry-run` ยังคงพิมพ์แผนได้
- **การสำรอง** แต่ละแผนจะได้โฟลเดอร์ `.ccam-backup/<time>/` ของตัวเองในโฟลเดอร์ของบัญชี โดยมีตัวเลขต่อท้ายเมื่อมีสองแผนเริ่มในวินาทีเดียวกัน ccam ไม่เคยลบโฟลเดอร์เหล่านี้
- **ความล้มเหลวบางส่วน** หากขั้นตอนใดล้มเหลว ccam จะพิมพ์ข้อผิดพลาดและตำแหน่งของต้นฉบับ แล้วบอกให้คุณทำต่อให้เสร็จด้วย `ccam doctor --fix` เป้าหมายถูกบันทึกไว้แล้ว การซ่อมจึงดำเนินต่อไปสู่เป้าหมายนั้น
- **ลิงก์ของคุณเอง** หากพาธเป็นลิงก์ที่คุณสร้างไว้อยู่แล้ว เช่น ลิงก์ไปยังรีโพสิทอรี dotfiles และกลุ่มยังว่าง ccam จะคัดลอกปลายทางของลิงก์เข้าไปในกลุ่ม และย้ายตัวลิงก์ไปไว้ในที่สำรอง ปลายทางจะไม่ถูกแตะ
- **ไฟล์เข้าสู่ระบบ** `.credentials.json` และ `.claude.json` จะไม่มีวันถูกลิงก์ ย้าย หรือคัดลอกเข้าไปในกลุ่ม
- **สองบัญชีในโฟลเดอร์เดียว** บัญชีที่ใช้ประวัติร่วมกันจะเขียนไฟล์เดียวกัน เมื่อบัญชีที่สองในกลุ่มประวัติเดียวกันเริ่มในโฟลเดอร์ที่มีอีกบัญชีหนึ่งทำงานอยู่แล้ว ccam จะเตือนและถามก่อนทำงานต่อ

## หัวข้อที่เกี่ยวข้อง

- [ใช้เซิร์ฟเวอร์ MCP การตั้งค่า และประวัติร่วมกัน](https://ccam.dev/th/docs/sharing.md)
- [เซิร์ฟเวอร์ MCP ที่ใช้ร่วมกัน](https://ccam.dev/th/features/mcp.md)
- [คัดลอกการตั้งค่าที่มีอยู่](https://ccam.dev/th/features/migrate.md)
- [คำสั่งทั้งหมด](https://ccam.dev/th/docs/commands.md)
