{"id":22894296,"url":"https://github.com/clearcodehq/jira_timemachine","last_synced_at":"2026-03-05T16:13:06.468Z","repository":{"id":34393125,"uuid":"153804530","full_name":"ClearcodeHQ/jira_timemachine","owner":"ClearcodeHQ","description":"Project used to migrate worklogs between two jira instances and kind of keep it up to date","archived":false,"fork":false,"pushed_at":"2025-04-30T04:32:57.000Z","size":1907,"stargazers_count":2,"open_issues_count":2,"forks_count":3,"subscribers_count":6,"default_branch":"main","last_synced_at":"2025-04-30T05:29:42.280Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ClearcodeHQ.png","metadata":{"files":{"readme":"README.rst","changelog":"CHANGES.rst","contributing":"CONTRIBUTING.rst","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":"AUTHORS.rst","dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2018-10-19T15:29:59.000Z","updated_at":"2025-04-30T04:32:59.000Z","dependencies_parsed_at":"2023-02-10T20:16:03.295Z","dependency_job_id":"31ef4af6-5eb6-4b04-adde-95e0ea99114f","html_url":"https://github.com/ClearcodeHQ/jira_timemachine","commit_stats":null,"previous_names":[],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ClearcodeHQ%2Fjira_timemachine","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ClearcodeHQ%2Fjira_timemachine/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ClearcodeHQ%2Fjira_timemachine/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ClearcodeHQ%2Fjira_timemachine/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ClearcodeHQ","download_url":"https://codeload.github.com/ClearcodeHQ/jira_timemachine/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252941389,"owners_count":21828866,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-12-13T23:17:25.853Z","updated_at":"2026-03-05T16:13:06.457Z","avatar_url":"https://github.com/ClearcodeHQ.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\njira_timemachine\n================\n\nThis package copies worklogs from a source JIRA to an issue in a destination JIRA. It's idempotent: rerunning it\nupdates already copied worklogs instead of duplicating them.\n\nTo re-write your worklog for the last three days from one JIRA to another, use timemachine command:\n\n.. code-block:: bash\n\n    timemachine --config example_config/config.json --days 3\n\nCheck the example config for the needed fields; both JIRA and Tempo require personal access tokens, see\n\u003chttps://support.atlassian.com/atlassian-account/docs/manage-api-tokens-for-your-atlassian-account/\u003e and\n\u003chttps://apidocs.tempo.io/\u003e.\n\n.. note::\n\n    Timemachine will use regular JIRA's worklogs to read worklogs from if you\n    won't have *tempo_token* configuration key, or have it empty.\n\nIssue mapping\n-------------\n\nIn a simple case, all worklogs are copied into a single destination JIRA issue: specify it as the\n``destination_jira.issue`` key in the config.\n\nTo copy worklogs of specific other issues to different issues, specify them in the ``issue_map`` config key: it's an\nobject with keys of source JIRA keys mapped to destination JIRA views. If a key is missing, ``destination_jira.issue``\nis used to choose the target issue.\n\nRunning ``timemachine`` again does not move existing worklogs. Do not remove destination issues from the ``issue_map``\nwhile they have matching worklogs: only known destination issues are searched for copied worklogs, ones present\nelsewhere will be duplicated.\n\nTempo dependency\n----------------\n\nThe destination JIRA must have the `Tempo \u003chttps://www.tempo.io/\u003e`__ plugin. It is\noptional for the source JIRA (and the ``timecheck`` command can be used as an\nalternative to the builtin JIRA time tracking reports).\n\nWhen source JIRA has Tempo and its token is provided, ``timemachine`` accesses all\nworklogs of the user; if Tempo is not used, only a single project (specified via\n``project_key``) is synchronized.\n\nIn case of the source JIRA gaining or losing Tempo (and the configuration having the\ntoken only when Tempo is used), we attempt to keep ``timemachine`` idempotent: worklogs\nare identified by their JIRA IDs, not Tempo IDs.\n\nUse via Docker\n--------------\n\nRun ``timemachine``::\n\n  docker run --rm -v $PWD/example_config:/config clearcode/jira_timemachine:1.2.2 timemachine --config /config/config.json\n\nRun ``timecheck``::\n\n  docker run --rm -v $PWD/example_config:/config clearcode/jira_timemachine:1.2.2 timecheck --config /config/config.json\n\nExample configs\n---------------\n\nMapping worklogs from the ``source.atlassian.net`` jira project ``JIRA`` to the\n``ARIJ-123`` issue on ``destination.atlassian.net``::\n\n  {\n    \"source_jira\": {\n      \"url\": \"https://source.atlassian.net\",\n      \"email\": \"login@login.com\",\n      \"jira_token\": \"\",\n      \"project_key\": \"JIRA\",\n      \"tempo_token\": \"\"\n    },\n    \"destination_jira\": {\n      \"url\": \"https://destination.atlassian.net\",\n      \"email\": \"login@login.com\",\n      \"jira_token\": \"\",\n      \"issue\": \"ARIJ-123\",\n      \"tempo_token\": \"\"\n    },\n    \"issue_map\": {\n    }\n  }\n\nMapping ``JIRA-101`` to ``ARIJ-1``, ``JIRA-102`` to ``ARIJ-2`` and every other issue to\n``ARIJ-3``::\n\n  {\n    \"source_jira\": {\n      \"url\": \"https://source.atlassian.net\",\n      \"email\": \"login@login.com\",\n      \"jira_token\": \"\",\n      \"project_key\": \"JIRA\",\n      \"tempo_token\": \"\"\n    },\n    \"destination_jira\": {\n      \"url\": \"https://destination.atlassian.net\",\n      \"email\": \"login@login.com\",\n      \"jira_token\": \"\",\n      \"issue\": \"ARIJ-3\",\n      \"tempo_token\": \"\"\n    },\n    \"issue_map\": {\n      \"JIRA-101\": \"ARIJ-1\",\n      \"JIRA-102\": \"ARIJ-2\"\n    }\n  }\n\nIn any of these examples, provide your own tokens; delete the ``tempo_token`` field in\n``source_jira`` or leave it blank if that JIRA has no Tempo plugin.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fclearcodehq%2Fjira_timemachine","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fclearcodehq%2Fjira_timemachine","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fclearcodehq%2Fjira_timemachine/lists"}